2016-08-18 4 views
4

私はこのようになりますいくつかの可変長引数テンプレートメソッドを、持っています。C++可変引数テンプレートメソッドの専門

いくつかの複合型に対してもう1つのInvoke定義を作成します。そしてここに私の質問があります: C++ 11/14で多様なテンプレートメソッドの特殊化を行うことは可能ですか? 私はこのような何かを意味する(簡単にするためには、私のタイプはint型になります):ここでは

template<int ... Args> 
    void Invoke(const char* funcName, Args ... args) 
    { 
     int params[] = { args ... }; 
     SomeComplexInvoke(funcName, params, sizeof ... (Args)); 
    } 

私はint型のいずれかのパラメータ数をとる特殊化を、したいので、私はちょうどこのようにそれを呼び出すことができます。

Invoke("method", 2, 4 ,9); 
+2

特殊化されていませんが、オーバーロードとSFINAEを使用できます。 – Jarod42

+0

しかし、 'std :: initializer_list '( 'Invoke("メソッド "{2、4、9})"構文のほうが適切です)。 – Jarod42

答えて

4

@ Jarod42に記載されているように、それは専門化で行うべきではありません。すべての引数の型がintであれば、あなたの例では、あなたが特別な何かをしたい、それでは、それをチェックするテンプレートを書いてみましょう:

template<typename ref, typename t, typename ...types> 
struct all_same { 
     static constexpr bool value = std::is_same<ref, t>::value && all_same<ref, types...>::value; 
}; 

template<typename ref, typename t> 
struct all_same<ref, t> { 
     static constexpr bool value = std::is_same<ref, t>::value; 
}; 

それは最初の型引数は、他のすべての型引数に等しいかどうかをチェックします。デモンストレーションのために今

template<typename ... Args> 
void Invoke(const char* funcName, Args ... args) 
{ 
    using params_type = typename std::conditional<all_same<int, Args...>::value, int, SPrimitive>::type; 
    params_type params[] = { args ... }; 
    SomeOtherInvoke(funcName, params, sizeof ... (Args)); 
} 

のは定義してみましょう:次にInvokeに、我々はargs...タイプに基づいてparamsタイプを選択する必要があり

struct SPrimitive{ 
}; 

void SomeOtherInvoke(const char*, SPrimitive*, size_t) { 
     std::cout << "Invoked for SPrimitive\n"; 
} 

void SomeOtherInvoke(const char*, int*, size_t) { 
     std::cout << "Invoked for int\n"; 
} 

をして

Invoke("foo", SPrimitive()); 
Invoke("foo", SPrimitive(), SPrimitive()); 
Invoke("foo", 1, 2, 3, 4); 

を呼び出す出力は、次のとおりです。

Invoked for SPrimitive 
Invoked for SPrimitive 
Invoked for int 

これはあなたが求めているものです。

+0

ありがとう、ちょうど私が探しているもの! – Michael

関連する問題