@ 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
これはあなたが求めているものです。
特殊化されていませんが、オーバーロードとSFINAEを使用できます。 – Jarod42
しかし、 'std :: initializer_list'( 'Invoke("メソッド "{2、4、9})"構文のほうが適切です)。 –
Jarod42