2010-07-22 10 views
2

Comment vérifieriez-vous le type d'objet lors de la mise en boucle de std :: list?Iterate std :: list <boost :: variant>

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 
    } 
} 
+3

std :: liste? Yuck! –

+0

En l'état, vous ne pouvez pas générer les données car elles sont privées. S'il y avait un moyen, alors la manière recommandée de le faire est avec un 'boost :: static_visitor'. – UncleBens

+0

@ Billy ONeal Pourquoi pas? Je l'ai choisi parce que je vais supprimer des objets de n'importe où dans la liste. – cpx

Répondre

1

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

à savoir l'aide get<T> renverra une T*. Si T* n'est pas nullptr, alors la variante est de type T.

1

Identique à la façon dont vous déterminez le type à partir d'une variante normale.

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 ... 
} 
Questions connexes