2016-10-23 13 views
0

なぜなら、次の例では、3つのintを持つインスタンシエーションが2番目の関数テンプレートでは機能しますが、最初のテンプレートでは機能しないという理由があります。 追加:State1/State1のタイプではどちらも機能しません。再帰的なバリデーショナル・テンプレートinstationが失敗する

struct State1{}; 
struct State2{}; 

#if 0 
template<typename none = void> 
constexpr void f() 
{ 
} 
template<typename First, typename... Rest> 
constexpr void f() 
{ 
    f<Rest...>(); 
} 
#else 
template<typename none = void> 
constexpr void f() 
{ 
} 
template<int First, int... Rest> 
constexpr void f() 
{ 
    f<Rest...>(); 
} 
#endif 
void test() 
{ 
    f<1, 2, 3>(); 
// f<State1, State2>(); 
} 

ありがとうございました!

+0

「問題はありません」は問題の説明ではありません。 – melpomene

+0

'1'は型ではなく、その逆もあります。 – krzaq

+0

テンプレートは1つの型を必要とし、整数リテラルを与えます。もう一方のテンプレートは整数を要求し、それに型を与えます。これがうまくいかないことにあなたはどのように驚いていますか? – DeiDei

答えて

0

最初のケースでは、1つのテンプレートパラメータを渡すと(パラメータパックが空の場合もある)、両方のテンプレートの特殊化が一致するため、オーバーロードセットには複数の候補が含まれています。 SFINAEを使用して、2番目のインスタンスをインスタンス化できないようにすることができます。

#include <type_traits> 

struct State1{}; 
struct State2{}; 

template<typename none = void> 
constexpr auto f() -> void 
{ 
} 

template<typename First, typename... Rest> 
constexpr auto f() -> std::enable_if<sizeof...(Rest), void>::type 
    // This will not instantiate when the parameter pack is empty 
    // And the overload set will contain only the candidate above 
{ 
    f<Rest...>(); 
} 

int main() 
{ 
    f<State1, State2>(); 

    return 0; 
} 
関連する問題