我正在尝试使用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吗?请注意,我不想使用虚拟成员。 谢谢!
答案 0 :(得分:1)
尝试使用boost::variant的矢量:
#include <iostream>
#include <vector>
#include <boost/variant.hpp>
#include <boost/foreach.hpp>
struct Foo
{
Foo(int v=0) : a(v) {}
int a;
};
struct Bar
{
Bar(int v=0) : b(v) {}
int b;
};
struct print_visitor : public boost::static_visitor<>
{
void operator()(const Foo& foo) const
{
std::cout << "Foo " << foo.a << "\n";
}
void operator()(const Bar& bar) const
{
std::cout << "Bar " << bar.b << "\n";
}
};
int main()
{
typedef boost::variant<Foo, Bar> Variant;
std::vector<Variant> bag;
bag.push_back(Foo(123));
bag.push_back(Bar(456));
BOOST_FOREACH(const Variant& element, bag)
{
boost::apply_visitor(print_visitor(), element);
}
}
boost :: variant的apply_visitor
函数对于避免过度回放到原始类型非常有用。
答案 1 :(得分:0)
Vector包含元素,其中每个元素与其他元素具有相同的类型。如果要创建不同类的元素的向量,可以使用类型boost::any
的元素向量。