容器/类型名称转发的递归模板类型

时间:2013-07-30 12:36:36

标签: c++

有没有办法获得递归模板类型?我有一个容器,我想为其指定底层存储策略。但是,内部模板必须使用外部模板的类型,因此它会在类型定义中产生一个循环 - 这是无法指定的。

关于我想要的:

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

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

C ++ 11解决方案很好(尽管我仍然使用gcc 4.6.3)。

2 个答案:

答案 0 :(得分:5)

您需要告诉编译器Inner是一个模板化的类:

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

答案 1 :(得分:0)

我不确定您添加Inner类型模板参数的原因,因为您将holder定义为基于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始终以holder定义inner,这有助于在定义Container时删除额外的模板参数。希望这可以帮助 :) 阿伦