类型不能存储在变量中。类型仅适用于编译器。甚至 RTTI 也不将类型存储在变量中,而是类型的“名称”。
我认为您只是想通过不必一遍又一遍地输入DeserializeComponent<>(json, e); 来缩短代码。好吧,您可以通过参数包扩展做到这一点。
template<typename... Components>
void DeserializeComponents(json_t& json, e_t& e)
{
(DeserializeComponent<Components>(json, e), ...);
}
// ...
DeserializeComponents<IDComponent, NameComponent, PointLightComponent>(json, e);
神奇之处在于 typename... Components - 它表示 Components 不仅仅是一个类型参数,而是一个类型参数列表 - 和 (DeserializeComponent<Components>(json, e), ...); 表示复制粘贴每个 Components 参数的函数调用,并且将它们与逗号运算符 , 一起加入
编译器展开模板时,展开后的模板如下所示:
void DeserializeComponents<IDComponent, NameComponent, PointLightComponent>(json_t& json, e_t& e)
{
(
DeserializeComponent<IDComponent>(json, e),
DeserializeComponent<NameComponent>(json, e),
DeserializeComponent<PointLightComponent>(json, e)
);
}