boost ptr_vector的C ++成员模板

时间:2010-05-28 17:07:47

标签: c++ templates boost stl

我正在尝试使用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吗?请注意,我不想使用虚拟成员。 谢谢!

2 个答案:

答案 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的元素向量。