【发布时间】:2010-05-28 17:07:46
【问题描述】:
我正在尝试使用 boost::ptr_vector 编写一个容器类。在 ptr_vector 里面我想包含不同的类。我正在尝试使用静态模板来实现这一点,但到目前为止我还无法做到这一点。比如容器类是
class model {
private:
boost::ptr_vector<elem_type> elements;
public:
void insert_element(elem_type *a) {
element_list.push_back(a);
}
};
我想要实现的是能够使用不同的 elem_type 类。下面的代码不能满足我的要求:
template <typename T>class model {
private:
boost::ptr_vector<T> elements;
public:
void insert_element(T *a) {
element_list.push_back(a);
}
};
因为当我初始化容器类时,我只能使用一个类作为模板:
model <elem_type_1> model_thing;
model_thing.insert_element(new elem_type_1)
但不是 elem_type_2:
model_thing.insert_element(new elem_type_2)//error, of course
是否可以仅在成员上使用模板?
class model {
private:
template <typename T> boost::ptr_vector<T> elements;
public:
void insert_element(T *a) {
element_list.push_back(a);
}
}; //wrong
所以我可以在我想要插入的特定类上调用 insert_element 吗?请注意,我不想使用虚拟成员。 谢谢!
【问题讨论】:
-
您收藏中的元素复制成本高吗?
-
从集合中检索元素时,如何知道每个位置存储的元素类型?
-
您的集合中可以存储的类型是否有限?或者可以存储任何东西?
-
您好,埃米尔,感谢您的回复。这个想法是开发一个通用容器。我会事先知道应该存储什么类型,但我需要更改代码以便在开发新元素后立即扩展它们。这部分代码会被执行很多次,所以虚拟继承太慢了。访问元素时,我需要静态转换之类的东西。我将只在向量上插入一次,但会在执行期间按顺序读取整个列表多次。