我有一个EntityComponent-System,并且有一个组件应该在各种其他组件上调用函数。对于这个例子,我选择了一个布尔函数结果的简单组合。
ResultCombinerComponent 具有可变参数模板参数,并且对于每个参数,它应按照给定模板参数的顺序调用函数。订单非常重要。
然后合并函数调用的结果。
在下面的代码中,我刚刚用psuedo-C ++替换了我不知道如何实现的部分
template<typename... Args>
class ResultCombinerComponent
{
template<typename T>
bool calcSingleResult()
{
return getComponent<T>()->calcResult();
}
bool calcResult()
{
bool result = true;
for (int i = 0; i < sizeof...(Args); i++) // doesn't work
{
if (!calcSingleResult<Args(i)>() // doesn't work
{
result = false;
break;
}
}
return result;
}
}
class A
{
bool calcResult();
}
class B
{
bool calcResult();
}
class C
{
bool calcResult();
}
答案 0 :(得分:2)
在C ++ 17中,您可以这样做:
bool calcResult()
{
return (calcSingleResult<Args>() && ...);
}
在c ++ 11中,你必须有其他方法:
template <typename T>
bool calcImpl()
{
return calcSingleResult<T>();
}
template <typename T, typename T2, typename...Ts>
bool calcImpl()
{
return calcSingleResult<T>() && calcImpl<T2, Ts...>();
}
bool calcResult()
{
return calcImpl<Args...>();
}