enable_if模板函数的关键顺序

时间:2015-02-26 17:07:38

标签: c++ c++11 metaprogramming enable-if template-function

为什么编译器对std::tuple的访问者具有以下定义顺序很重要

namespace TupleVisit{

        //This function SHOULD BE DEFINED SECONDLY; 
        //IN THIS CONFIGURATION COMPILER DOES NOT 
        //SEE THE BELOW RECURSTION TERMINATION ???
        template<std::size_t Idx = 0,
                 typename Visitor,
                 typename... T,
                 typename std::enable_if< Idx < sizeof...(T) , void *>::type = nullptr
                 >
        static
        void visit(Visitor && v, std::tuple<T...>  & t){
            v( std::get<Idx>(t) );
            TupleVisit::visit<Idx+1, Visitor, T... >(std::forward<Visitor>(v),t);
        }


        template<std::size_t Idx = 0,
                 typename Visitor,
                 typename... T,
                 typename std::enable_if< Idx == sizeof...(T) , void *>::type = nullptr
                  >
        static void
        visit(Visitor && v, std::tuple<T...> & t){}
}

实例:Code

我认为多个enable_if开关的一般规则应该是对所有函数进行原型设计,然后以任何顺序定义它们?这会导致SFINAE始终看到正确的可用功能吗?

1 个答案:

答案 0 :(得分:4)

为什么会看到下面宣布的visit

template函数不是宏 - 函数查找是在模板编写时完成的,加上ADL查找来自模板调用的上下文

由于无法通过ADL找到第二个visit,因此在第一个visit内的通话点处无法看到它。