2016-10-13 7 views
7

私は可変テンプレートクラスを持っていると言います。引数が設定された型の関数、たとえばintを作成し、引数の数がテンプレートの型の数と等しいようにするにはどうすればよいですか?すべてのテンプレートタイプに対して、セットタイプの引数

template <typename... Types> 
class Test 
{ 
public: 
    void Func(???); // I don't know how to declare such a function 
} 

Test<string, bool, long> myTest; // Three types 
myTest.Func(905, 36, 123315); // Three arguments, but always of type int. 

最後に、この関数の目的は、提供されたintのタプルを返すことです。わかりやすくするために、サンプルコードでは関数を無効にしました。

+0

[これ](http://stackoverflow.com/questions/3703658/specifying-one-type-for-all-arguments-passed-to-variadic-function-or-variadic -te)と 'sizeof ...'チェックを追加していますか? – LogicStuff

+0

このように? http://ideone.com/PASclP –

+1

パラメータパックのサイズは呼び出しによって推測できるので、ここで 'Types'は必要ありません:http://ideone.com/tPe6Tj –

答えて

17
template <typename... Types> 
class Test 
{ 
    template <typename> 
    using int_t = int; 

public:  
    void Func(int_t<Types>... ints) 
    { 
    } 
}; 

DEMO

+1

賢い!私はこの解決策が好きです。 –

+1

解決策では暗黙的な変換が可能であることに注意してください。OPが望んでいるかどうかはわかりません。 –

+0

これはどうやって動作するか教えてください。私はテンプレートと組み合わせたものを見たことがありません。 –

4

wandbox exampleから(C++ 11で動作します)


あなたがSFINAEを必要としない場合、あなたはあなたの条件が満たされていることを確認するstatic_assertを使用することができます。

template <typename... Types> 
class Test 
{ 
public: 
    template <typename... Ts> 
    void Func(Ts...) 
    { 
     static_assert(sizeof...(Ts) == sizeof...(Types), ""); 
     static_assert(std::conjunction<std::is_same<Ts, int>...>{}, ""); 
    } 
}; 

(SFINAEが必要な場合は、std::enable_ifを使用してください)

std::conjunctionは、渡されたすべての条件が真であることをチェックします。上記の例では


、次の呼び出しは無効/有効です。

myTest.Func(905, 36, 123315); // valid 
myTest.Func(905, 36, 123315.f); // invalid 
myTest.Func(905, 22); // invalid 

あなたが見ることができるように、暗黙の型変換は、このソリューションで許可されていません。許可したい場合はstd::is_sameの代わりにstd::is_convertibleを使用できます。

+0

プラス 'connections'はC++ 17です、危険な危険です。 –

+1

@GillBates:それを実装するのは簡単です。私のwandboxの例を見てください。これはC++ 11で動作します。 –

+0

あなたのソリューションが私の質問を完全に解決することに同意します。しかし、Piotr Skotnickiのソリューションは私の意見では読みやすく、他の同様の用途に(私にとっては)簡単に拡張することができました。あなたのものが私に多くの助けをしたとしても、そのように私は彼の答えを最高のものとして選びます。 –

関連する問題