我有一个递归的可变参数模板化方法,它是从一个非递归的可变参数模板方法调用的(可能不相关但我会在以下情况下提到它):
template < class T, class UnaryPredicate, typename... UnaryPredicates >
static bool checkPredicate( const T obj,
const UnaryPredicate& p,
UnaryPredicates... predicates )
{
bool output = p( obj );
if ( output && sizeof...( UnaryPredicates ) ) {
output = checkPredicate( obj, predicates... ); // The problem line.
}
return output;
}
但是在调用时:
.. = checkPredicate< Sy_simObject*, VisiblePredicate< Sy_simObject* >( .. );
它给了我以下错误:
错误:没有匹配的调用函数 'Sy_project :: checkPredicate(Sy_simObject * const&amp;)'
我理解错误告诉我UnaryPredicates
为空,并且只有T
没有重载,如果我把其中一个编译得很好就足够了。但我不理解如何通过条件中的sizeof...( UnaryPredicates )
检查得到这么多?当然,如果没有更多,它会被评估为假,递归会结束吗?
我可以通过添加重载来修复它,我真的想了解它为什么现在不起作用。
答案 0 :(得分:4)
因为if(cond) { body }
是运行时。编译器在编译时可以在运行时知道它不需要在运行时分支的事实可以用来优化生成的代码,但它不能影响它是否会抱怨代码的某些部分。
如果body
为cond
false
的代码无效,编译器会抱怨。您正在寻找的是 static if if ,它控制代码的某些部分是否由编译器处理。对于下一个C ++版本有这样的建议,但是当前的C ++没有这样的结构。