迭代std :: list <boost :: variant> </boost :: variant>

时间:2010-07-22 17:04:17

标签: c++ boost-variant

循环std :: list时如何检查对象类型?

class A
{
    int x; int y;
public:
    A() {x = 1; y = 2;}
};

class B
{
    double x; double y;
public:
    B() {x = 1; y = 2;}
};

class C
{
    float x; float y;
public:
    C() {x = 1; y = 2;}
};

int main()
{
    A a; B b; C c;
    list <boost::variant<A, B, C>> l;
    l.push_back(a);
    l.push_back(b);
    l.push_back(c);

    list <boost::variant<A, B, C>>::iterator iter;

    for (iter = l.begin(); iter != l.end(); iter++)
    {
            //check for the object type, output data to stream
    }
}

2 个答案:

答案 0 :(得分:1)

来自boost's own example

void times_two( boost::variant< int, std::string > & operand )
{
    if ( int* pi = boost::get<int>( &operand ) )
        *pi *= 2;
    else if ( std::string* pstr = boost::get<std::string>( &operand ) )
        *pstr += *pstr;
}

即。使用get<T>将返回T*。如果T*不是nullptr,则变体的类型为T

答案 1 :(得分:1)

与从常规变体中确定类型的方式相同。

for (iter = l.begin(); iter != l.end(); iter++)
{
        //check for the object type, output data to stream
        if (A* a = boost::get<A>(&*iter)) {
            printf("%d, %d\n", a->x, a->y);
        } else ...
}