Если значение вашего контейнера ограничено небольшим количеством типов, вы можете достичь этого, используя boost::variant
, как показано здесь:
#include <vector>
#include <boost/variant.hpp>
using namespace std;
class text
{ };
class element
{ };
template <typename T>
class node
{
T cargo;
static std::vector<boost::variant<text, element>> children;
node(const T& cargo) : cargo(cargo)
{ };
void add_child(const T& node)
{
children.push_back(boost::variant<text, element>(node));
}
};
Я позволил себе предложить пару других модов - используйте ссылку const
вместо передачи по значению в конструкторе node
и add_child
; сделайте контейнер children
статическим, так как я не думаю, что для каждого node<T>
имеет смысл иметь свой собственный контейнер. В этом случае для многопоточного использования add_child
потребуется блокировка. Эти комментарии применяются независимо от того, можете ли вы использовать Boost или нет в своем окончательном решении.
Вы можете выполнять операции с элементами vector
, используя get
или static_visitor
- последний вариант предпочтительнее, поскольку вы можете сделать это универсальным - как показано здесь Пример итерации vector
, аналогичный тому, который вы использовали бы для этого решения:
class times_two_generic
: public boost::static_visitor<>
{
public:
template <typename T>
void operator()( T & operand ) const
{
operand += operand;
cout << operand << endl;
}
};
std::vector< boost::variant<int, std::string> > vec;
vec.push_back( 21 );
vec.push_back( "hello " );
times_two_generic visitor;
std::for_each(
vec.begin(), vec.end()
, boost::apply_visitor(visitor)
);
Вывод:
42
привет привет