2013-07-30 8 views
6

再帰的テンプレート・タイプを取得する方法はありますか?私は基本的なストレージ戦略を指定したいコンテナを持っています。しかし、内部テンプレートは外部テンプレートの型を使用しなければならないので、型定義にループを引き起こします。これは指定できません。私が欲しいものについてコンテナ/タイプ名転送用の再帰テンプレート・タイプ

:(私はGCC 4.6.3にはまだだが)

template<typename C> 
struct inner { 
    C * object[16]; 
}; 

template<typename T, typename Inner> 
struct container { 
    T value; 
    Inner<container> holder; 
}; 

C++ 11のソリューションは、罰金です。

+3

「奇妙な再帰テンプレートパターン」(CRTP)と呼ばれるものがありますか? http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern – Jimbo

+0

この再帰的なデータ型は、リンクされたリストと区別するための新しい動作は何ですか? – abiessu

+0

@abiessu、私の現在の使用は、実際には基数木です。各ノードには、次のノードに到達する方法のインデックスがあり、 'inner'はそのインデックスの戦略を指定するものです。つまり、テンプレートでは、固定赤黒、ハッシュ、またはその他の戦略とは対照的に、子供の管理方法を指定できます。 –

答えて

5

あなたはInnerはテンプレートクラスであり、コンパイラ指示する必要があります:あなたがタイプするholderを定義しているので、私は、なぜあなたはInner型テンプレートパラメータを追加しているかわからない

template<typename T, template<typename> class Inner> 
struct container { 
    T value; 
    Inner<container> holder; 
}; 
+0

なぜInnerの前に 'class'でなければならないのだろうか?もはやジェネリックパラメータではなく、クラス型であると理解していますが、 'struct'も動作すると期待していました。それ以来私はかなり理解しているか分からない。 –

+0

@ edA-qamort-ora-yテンプレートの仕組みです。一般的な 'typename'キーワードまたは' class'を使うことができます。しかしこの場合、 'Inner'はテンプレートクラスそのものなので' class'テンプレートとして宣言しなければなりません。テンプレート化された構造体は定義できますが、テンプレートの引数リストには定義できません。 –

0

Containerinnerに基づいており、両方とも所有者を宣言している時点で利用可能です。

struct inner以外のタイプをテンプレートパラメータとしてContainerに使用する予定ですか?そうでない場合は、以下の単純化されたコードをコンパイルし、VS2010で私のために走った:

#include <vector> 
#include <stdio.h> 

template <typename C> 
struct inner{ 
    C * objects[16]; 
    bool hasobj; 

    inner():hasobj(false){} 
}; 

template <typename T> 
class Container { 
    inner<Container> holder; 
    T value; 
public: 

    Container(const T& valueP){ 
     value = valueP; 
    } 
    void AddChild(Container* rhs){ 
     holder.objects[0] = rhs; //Always using first location, just for example 
     holder.hasobj = true; 
    } 

    void PrintStuff()const{ 
     if(holder.hasobj){ 
      holder.objects[0]->PrintStuff(); 
     } 
     printf("VAL IS %d\n", value); 
    } 
}; 

int main(){ 
    Container<int> c(10); 

    Container<int> c1(20); 
    c1.AddChild(&c); 
    c1.PrintStuff(); 
} 

基本的に、これはcontainerは常にとき、余分なテンプレートパラメータを取り除く役立つ、innerの面でholderを定義していることを想定していますContainerを定義します。これが役に立ちますようお願いいたします。 arun

+0

Innerについて、そうです、それが目的です。内部クラスに使用されている型を選択することができます。 –