3

タイプがテンプレートクラスである変数があり、別のテンプレートクラスの別の変数を作成したいが、同じテンプレートパラメーターを使用する場合、どうすればよいですか?

以下の例は機能しませんが、うまくいけば、私が達成しようとしていることのアイデアが得られます。これを行うための非常に具体的な方法がない場合、これを行うためのある種のルックアップテーブルデザインパターンを持つ方法はありますか?おそらく私が使用することになるテンプレートタイプは6つほどしかありません。

template<typename T>
class A{
public:
    typedef T Type;
};

template<typename T>
class B{};

int main(void){
    A<int> var1;

    B<var1::Type> var2;
}

これが重複した質問である場合はお詫びしますが、以前にこのような質問があったことはありませんでした。

編集

サードパーティのライブラリを使用せずに、これをVisualStudio2010およびgccで機能させる方法を希望します。したがって、すべてのC++11機能がサポートされているわけではありません。

また、このコードは、私が欲しいものの基本的な機能を示すための単なるテストケースシナリオであるため、typedef A<int>またはを使用せずに。A<int>タイプがテンプレートである変数からテンプレートタイプを取得する方法が必要です。

4

2 に答える 2

2

C ++ 11では、次を使用できますdecltype

B<decltype(var1)::Type> var2;

そしてそれは動作するはずです。ここここでdecltypeを参照してください。

C ++ 03で同様のことをしたい場合は、テンプレート化された関数内に機能を適用してみてください。

template <typename T>
void doSomething(const T& var1) {

  B<typename T::Type> var2;
  // do whatever you wanted to do with var2 here.
  // problem is, you cannot return it.
  std::cout << "Doing something!\n";

}

int main(void){
    A<int> var1;
    doSomething(var1);
}

編集: VS2010にキーワードがあることを指摘してくれた@MSaltersに感謝しますauto。そのため、この関数を定義できます。

template <typename T>
B<typename T::Type> makeB(const T&) {
  return B<typename T::Type>();
}

次に、次のように使用します。

int main(void){
    A<int> var1;
    auto var2 = makeB(var1);
}
于 2012-04-19T06:18:51.813 に答える
2

VC++ 2010 の標準化前の decltype でも、次のようなことができると思います。

template<typename T>
struct A {
    typedef T Type;
    Type foo();
};

template<typename T>
struct B {};

int main() {
    A<int> var1;
    B<decltype(var1.foo())> var2;
}

これは、必要な型を使用する式を形成できるかどうかに依存します。

于 2012-04-19T07:25:35.527 に答える