Вы можете использовать Boost.Variant для этого. Вариант может быть построен непосредственно из любого значения, конвертируемого в один из его ограниченных типов. Аналогично, варианту может быть присвоено любое значение, конвертируемое в один из его ограниченных типов. Вот как вы можете использовать его в своем классе:
class myClass
{
private:
boost::variant<classOne, classTwo> obj;
public:
myClass(classOne object) : obj(object)
{
}
myClass(classTwo object) : obj(object)
{
}
};
Она также обеспечивает очень удобный boost::get
для извлечения значения из варианта. Вы можете использовать это для подачи кода для каждого ограниченного типа, который у вас есть (т.е. classOne
и classTwo
). Вот пример:
if (classOne * x = boost::get<classOne>(&obj))
{
//Code for classOne
}
else if (classTwo * x = boost::get<classTwo>(&obj)
{
//Code for classTwo
}
Однако такой код довольно хрупкий, и без пристального внимания, вероятно, приведет к введению тонких логических ошибок обнаруживаемых только во время выполнения. Таким образом, использование варианта в реальном мире обычно требует более надежного механизма доступа, чем get
. По этой причине вариант поддерживает время, прошедшее проверку во время компиляции, через apply_visitor
. Для посещения требуется, чтобы программист явно обрабатывал (или игнорировал) каждый ограниченный тип. Невыполнение этого условия приводит к ошибке времени компиляции.
Для посещения варианта требуется объект-посетитель. Как это:
class object_visitor
: public boost::static_visitor<>
{
public:
void operator()(classOne & x) const
{
//Code for classOne
}
void operator()(classTwo & x) const
{
//Code for classTwo
}
};
При реализации вышеуказанного посетителя, мы можем применить его к obj
, как показано в следующем:
boost::apply_visitor(object_visitor(), obj);
сделать '' classOne' и classTwo' имеют общую базу класс? – Flexo
нет, есть совершенно другая структура, я добавлю это на вопрос – stefan
Спасибо всем за ваши ответы. Я возьму простой способ и реализую два метода и проверю тип вручную. Я думал, что это может быть проще, просто имея один метод. – stefan