views:

42

answers:

2

How would you check for the object type when looping 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
    }
}
+1  A: 

From 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;
}

i.e. Using get<T> will return a T*. If T* is not nullptr, then the variant is of type T.

Gianni
+1  A: 

Same as how you determine the type from a regular variant.

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 ...
}
KennyTM