のビジターを次のように定義することがコンパイラーにとって重要なのはなぜですか。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 で利用可能な正しい関数が常に表示されるようになりますか?