struct A
{
std::string get_string();
};
struct B
{
int value;
};
typedef boost::variant<A,B> var_types;
std::vector<var_types> v;
A a;
B b;
v.push_back(a);
v.push_back(b);
Как я могу повторить итерацию через элементы v, чтобы получить доступ к объектам a и b?Как перебирать последовательность ограниченных типов с помощью Boost.Variant
Я могу сделать это с усилением :: получить, но синтаксис очень громоздким .:
std::vector<var_types>:: it = v.begin();
while(it != v.end())
{
if(A* temp_object = boost::get<A>(&(*it)))
std::cout << temp_object->get_string();
++it;
}
Я пытался использовать технику посмотреть недвижимость, но я не слишком далеко и код не работает:
template<typename Type>
class get_object
: public boost::static_visitor<Type>
{
public:
Type operator()(Type & i) const
{
return i;
}
};
...
while(it != v.end())
{
A temp_object = boost::apply_visitor(get_object<A>(),*it);
++it;
}
EDIT 1
хак решение:
class get_object
: public boost::static_visitor<A>
{
public:
A operator()(const A & i) const
{
return i;
}
A operator()(const B& i) const
{
return A();
}
};
Так что вы хотите итерацию через объект и для каждого элемента вызова либо функции X или Y, в зависимости от того, если вариант имеет степень А или В? – GManNickG
Да, в значительной степени :) – anno