2012-04-19 10 views
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; 
} 

これは重複した質問ですが、これまでに尋ねたようなことはありませんでした。

EDIT

私は、これは、サードパーティのライブラリを使用せずに、Visual Studioの2010年とgccで動作するための方法をしたいと思います。したがって、C++ 11のすべての機能がサポートされるとは限りません。

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

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

をし、それが動作するはずです:

+0

FWIW、コンパイルするあなたの例を得るために、変更 ' VAR1;' VAR1のtypedef 'へ;' –

+0

@Jesseポイントは 'var1'は、変数、ないタイプであるということです。 –

+0

OK、私はそれをテストすることはできませんが、VS2010で動作する別のバリ​​アントを追加しました。 – juanchopanza

答えて

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; 
} 

これは、あなたが望むタイプを使用して、いくつかの表現を形成することができるに依存します。

2

C++ 11では、あなたはdecltypeを使用することができます。 decltype hereおよびhereを参照してください。

あなたが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); 
} 

編集:あなたが持っていることを指摘し@MSaltersに感謝VS2010での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); 
} 
+0

これも同じエラーが出るようです。 – mmurphy

+0

@mmurphyええ、それは早すぎる、申し訳ありません。合計ナンセンスの答え... – juanchopanza

+0

@ mmurphy OK、C++ 11用に修正されました。同等のC++ 03テンプレートマジックを思いつくことができるかどうかがわかります。 – juanchopanza

関連する問題