Самый простой способ иметь дело с Boost.Variant
- это обычно использовать Visitor.
template <class Type>
class TypeChecker: boost::static_visitor<>
{
public:
explicit TypeChecker(bool& result): mResult(result) {}
template <class T>
void operator()(const T& t) const { mResult = dynamic_cast<const Type*>(&t); }
private:
bool& mResult;
};
Тогда вы можете обернуть его:
template <class Type, class Variant>
bool checkType(const Variant& v)
{
bool result = false;
boost::apply_visitor(TypeChecker<Type>(result), v);
return result;
}
, который можно использовать так:
int main(int argc, char* argv[])
{
typedef boost::variant<Dog,Cat,Kid> variant_type;
variant_type var = /**/;
if (checkType<Animal>(var))
{
}
else
{
}
}
Однако это не OO-путь и не альтернативный способ.
Лучше было бы использовать всю мощь Boost.Variant
:
struct DoIt: boost::static_visitor<>
{
void operator()(const Animal& animal) const {}
void operator()(const Kid& kid) const {}
};
int main(int argc, char* argv[])
{
typedef boost::variant<Dog,Cat,Kid> variant_type;
variant_type var = /**/;
boost::apply_visitor(DoIt(), var);
}
Обратите внимание, как концепция static_visitor
естественным образом обрабатывает наследование.