Boost any

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

any

La classe boost::any permette di trattare allo stesso modo oggetti di tipo diverso, permettendo ad esempio di usare un container STL per una collezione di oggetti eterogenei.

Nell'esempio che segue, metttiamo oggetti di svariati tipi in un container di boost::any. Dato che il costruttore di any non é esplicito, ci possiamo anche risparmiare la fatica di fare un cast che viene fatto, per l'appunto, implicitamente.

La funzione anyPrint() ci mostra come estrarre l'oggetto da any usando any_cast<> sull'indirizzo dell'oggetto any. Se l'oggetto non é del tipo atteso, any_cast<> ritorna NULL. Alternativamente, se il fallimento del casting fosse considerabile un errore, potremmo tentare di applicare any_cast<> sull'oggetto. In questo caso il fallimento porterebbe ad una eccezione - come si vede nel caso della gestione del tipo string nella stessa funzione.

#include <iostream>
#include <string>
#include <utility>
#include <vector>
#include "boost/any.hpp"

using namespace std;

class A {
public:

void some_function() {
cout << "A::some_function()" << endl;
}
};

class B {
public:

void some_function() {
cout << "B::some_function()" << endl;
}
};

class C {
public:

void some_function() {
cout << "C::some_function()" << endl;
}
};

typedef pair<bool, double> BoolDouble;

void anyPrint(boost::any& a) {
if (A* pA = boost::any_cast<A> (&a)) {
pA->some_function();
} else if (B* pB = boost::any_cast<B> (&a)) {
pB->some_function();
} else if (C* pC = boost::any_cast<C> (&a)) {
pC->some_function();
} else if (int* pInt = boost::any_cast<int> (&a)) {
cout << *pInt << endl;
} else if (BoolDouble* pPair = boost::any_cast<BoolDouble> (&a)) {
if (pPair->first)
cout << pPair->second << endl;
} else {
try {
cout << boost::any_cast<string> (a) << '\n';
} catch (boost::bad_any_cast&) {
cout << "Oops!\n";
}
}
}

int main() {
cout << "Example of using any.\n\n";

vector<boost::any> store_anything;

store_anything.push_back(A());
store_anything.push_back(B());
store_anything.push_back(C());

// While we're at it, let's add a few other things as well
store_anything.push_back(string("This is fantastic! "));
store_anything.push_back(3);
store_anything.push_back(make_pair(true, 7.92));
store_anything.push_back(3.14);

for_each(store_anything.begin(), store_anything.end(), anyPrint);
}

Nessun commento:

Posta un commento