1

为什么对编译器的访问者具有以下定义顺序很重要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){}
}

现场示例:代码

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

4

1 回答 1

4

为什么它会看到它visit下面的声明?

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

由于visit无法通过 ADL 找到第二个,因此在第一个中的调用点不可见visit

于 2015-02-26T20:18:26.743 回答