選択肢は 2 つあります。Foo
例のために、テンプレート構造体と次の宣言を検討してください。
Foo<double> v;
あなたの最初の選択は
template <typename T>
void DoSomething1(T& x) { /* ... */ }
// ...
DoSomething1(v);
私はこれがあなたが必要としているものだと強く信じています.
ただし、そうではない場合もあります。おそらく、 がテンプレート クラスであり、 がT<U>
型であるフォームの型で関数を呼び出す必要があります。たとえば、関数の本体内で (つまり、 create ) を使用してインスタンス化することができます。次に、2番目の選択肢はT
U
T
int
T<int> y;
template <template <typename> class T, typename U>
void DoSomething2(T<U>& x) { T<int> y; /* ... */ }
// ...
DoSomething2(v);
残念ながら、これではまだ十分ではない可能性があります。試してみると、
std::vector<double> w;
// ...
DoSomething2(w);
最後の行はコンパイルに失敗します。その理由は、std::vector
2 つの型パラメーターを受け取るテンプレート クラスであり、DoSomething2
1 つだけを受け取るテンプレート クラスを想定しているためです。(もちろんstd::vector
、2 番目の引数にはデフォルト値があるため、1 つの引数だけでインスタンス化できます。) 解決策は、C++11 可変個引数テンプレート テンプレート パラメーターを使用することです。
template <template <typename, typename...> class T, typename U>
void DoSomething3(T<U>&) { T<int> y; /* ... */ }
// ...
DoSomething3(v);
DoSomething3(w);