2016-03-23 2 views
-1

Je voudrais utiliser la bibliothèque boost (boost :: variant) en C++ pour définir un vecteur si des entiers et des chaînes. J'ai du mal à remplir un tel vecteur - quelqu'un peut soit poster un code exemple avec remplit un vecteur avec ints et stringsen utilisant la bibliothèque Boost et lit les éléments du vecteur ou autrement diriger moi à un exemple.Génération d'un vecteur avec des arguments int et string

J'ai recherché des articles avec le tage boost::variants sur le SO, mais je n'ai pas trouvé ce que je voulais.

+0

Qu'avez-vous essayé jusqu'à présent? exemple de code – DimChtz

+0

Si je suis correct 'boost :: variant , vector > v;' définit un vecteur 'v' avec des entrées int et string. Mais je ne sais pas comment le remplir. – Sid

+0

@DimChtz, j'ai aussi regardé le boost [tutoriel] (http://www.boost.org/doc/libs/1_55_0/doc/html/variant/tutorial.html) – Sid

Répondre

1

Voici quelques exemples (écrites de la mémoire):

typedef boost::variant< 
    std::string, 
    int 
> StringOrInt; // using a typedef is just for convenience 

StringOrInt myVariant; 
myVariant = std::string("hello"); // both of these work 
myVariant = 5; 

std::vector<StringOrInt> myvec; 
myvec.push_back(5); 
myvec.push_back(std::string("hello")); 

Puis lire, il y a deux façons. L'un utilise boost :: get, l'autre utilise un visiteur. Le visiteur est généralement un peu plus robuste, mais si c'est un cas simple, boost :: get peut bien fonctionner.

std::string& mystr = boost::get<std::string>(myvec[0]); // this will throw if the type you requested isn't what's stored 
std::string* mystr = boost::get<std::string*>(myvec[0]); // pointer version doesn't throw 

Puisque vous itérez probablement, un visiteur fonctionnera probablement mieux. Vous créez un foncteur qui a des surcharges pour chaque type dans votre variante, et utilisez boost::apply_visitor. Par exemple:

struct MyVisitor { 
    void operator()(const std::string& arg) const { 
     std::cout << "It was a string"; 
    } 

    void operator()(int arg) const { 
     std::cout << "It was an int"; 
    } 
}; 

MyVisitor myVisitor; 
for (auto& val : myvec) { 
    boost::apply_visitor(myVisitor, val); 
} 
+0

Je reçois l'erreur de compilation: non fonction correspondante pour l'appel à apply_visitor, lorsque j'essaie d'accéder à des éléments du vecteur en itérant sur ce dernier. A savoir, si j'utilise le dernier segment du code que vous avez posté. Aucune suggestion? – Sid

+0

pouvez-vous également expliquer ce que fait la dernière partie, c'est-à-dire la partie "visiteur"? – Sid

+0

J'ai mis à jour le code. Il aurait dû avoir le 'struct MyVisitor: public boost :: static_visitor <>' par opposition à simplement 'struct MyVisitor'. – Sid

0

Vous pouvez créer un vecteur de chaînes, puis utiliser .toString() dans les positions avec des nombres. Ou au moins en Java, vous pouvez créer une classe VectorIntString que chaque instance de la classe a les deux vecteurs. Donc, lorsque vous construisez l'objet: vous allez faire quelque chose comme ça

VectorIntString vec= new VectorIntString(int a,String a, int b, String b.... ,); 

Ainsi, le constructeur ajoutera la position de cotes au vecteur Int et même des positions au vecteur de chaîne.