C++ 启用模板函数的关键顺序

C++ 启用模板函数的关键顺序,c++,c++11,metaprogramming,enable-if,template-function,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, t

对于
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){}
}
namespace-TupleVisit{
//其次要明确这一功能;
//在此配置中,编译器不会
//参见下面的递归终止???
模板::type=nullptr
>
静止的
无效访问(访客和v,标准::元组和t){
v(std::get(t));
TupleVisit::访问(std::转发(v),t);
}
模板::type=nullptr
>
静态空隙
访问(访问者&v,std::tuple&t){}
}
实例:


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

为什么它会看到下面声明的
访问

template
函数不是宏——函数查找在编写模板时完成,再加上从调用模板的上下文进行ADL查找


由于无法通过ADL找到第二次
就诊
,因此在第一次
就诊

的呼叫点上看不到该就诊
,为什么它会看到下方声明的
就诊

template
函数不是宏——函数查找在编写模板时完成,再加上从调用模板的上下文进行ADL查找

由于第二次
就诊
无法通过ADL找到,因此在第一次
就诊
的呼叫点处不可见