1

我有一个递归可变参数模板化方法,它是从非递归可变参数模板化方法调用的(可能不相关,但我会提到它以防万一):

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&)”的匹配函数

我知道错误告诉我那UnaryPredicates是空的,并且 just 没有重载,T如果我在其中放入一个就可以正常编译。但是我不明白在条件检查中它怎么能走那么远sizeof...( UnaryPredicates )?当然,如果没有更多,它会被评估为假并且递归会结束吗?

我可以通过添加重载来修复它,我真的很想了解为什么它现在不起作用。

4

1 回答 1

4

因为if(cond) { body }是一个运行时 if。编译器可以在编译时预先知道它不需要在运行时分支的事实可以用来优化生成的代码,但它不能影响它是否抱怨代码的某些部分。

如果 if is的代码body无效,编译器会报错。您正在寻找的是一个静态 if,它控制您的代码的某些部分是否由编译器处理。下一个 C++ 版本有这样的提议,但当前的 C++ 没有这样的结构。condfalse

于 2012-08-03T18:52:00.070 回答