Boost variant

Da Beyond the C++ Standard Library: An Introduction to Boost, di Björn Karlsson.

variant

Con boost::variant si ha una miglior gestione di un tipo generico rispetto a quanto offerto da boost::any.

In particolare, all'atto della creazione di un oggetto possiamo specificare quali tipi sono accettabili in quel specifico caso.

Per estrarre l'oggetto dal variant possiamo usare la funzione get<>(), che funziona come any_cast<>(). Il suo svantaggio é che tende a rendere il programma ingestibile.

Quando possibile é opportuno usare un functor che specializzi la classe static_visitor. Questa deve avere l'implementazione dell'operator() per ogni tipo gestito dal variant che lo usa. Se ne manca uno, si ha un errore in compilazione.

Un esempio dovrebbe chiarire quanto scritto sopra:

#include <iostream>
#include <boost/variant.hpp>

using namespace std;

class Printer : public boost::static_visitor<void> {
public:
void operator()(int& i) const {
cout << "It's an int: " << i << endl;
}

void operator()(string& s) const {
cout << "It's a string: " << s << endl;
}

void operator()(double& d) const {
cout << "It's a double: " << d << endl;
}
};

int main() {
boost::variant<int,string,double> var("Hello");

string hello = boost::get<string>(var);

cout << "Var contains: " + hello << endl;

try {
int wrong = boost::get<int>(var);
cout << "Unexpected: " << wrong << endl;
}
catch(const boost::bad_get& exc) {
cout << "There's not an int in: " << exc.what() << endl;
}

int* pWrong = boost::get<int>(&var);
if(pWrong == NULL) {
cout << "There's not an int in var." << endl;
}

Printer p;
boost::apply_visitor(p, var);
}

Nessun commento:

Posta un commento