0

構造体の場合

<template typename T>
struct Foo
{
 ...
}

<template typename T>
struct Boo
{
 ...
}

のように呼び出す関数を作成したい

DoSomething<Boo<int>>(x);
DoSomething<Foo<float>>(x);

私はこのようなことを試しました

<template typename T>
<template typename U>
void DoSomething(T<U>& x)

しかし、コンパイルされません。この種の関数のテンプレートを作成するにはどうすればよいですか?

ありがとう

4

4 に答える 4

3

両方のタイプを指定する場合は、テンプレート テンプレート パラメータを使用する必要があります。

template <template<typename> class T, typename U>
void DoSomething(T<U>& x)

ただし、達成したい内容によっては、関数に両方の型を含める必要がない場合は、単一のテンプレート パラメーターを使用するだけで機能します。

template <typename Y>
void DoSomething(T& x)
于 2013-09-13T10:10:59.657 に答える
0

選択肢は 2 つあります。Foo例のために、テンプレート構造体と次の宣言を検討してください。

Foo<double> v;

あなたの最初の選択は

template <typename T>
void DoSomething1(T& x) { /* ... */ }
// ...
DoSomething1(v);

私はこれがあなたが必要としているものだと強く信じています.

ただし、そうではない場合もあります。おそらく、 がテンプレート クラスであり、 がT<U>型であるフォームの型で関数を呼び出す必要があります。たとえば、関数の本体内で (つまり、 create ) を使用してインスタンス化することができます。次に、2番目の選択肢はTUTintT<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::vector2 つの型パラメーターを受け取るテンプレート クラスであり、DoSomething21 つだけを受け取るテンプレート クラスを想定しているためです。(もちろん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);
于 2013-09-13T10:22:05.593 に答える