可完美替换掉C的union,而且不仅是POD类型。
取回也更加方便
#include "stdafx.h"
#include <string>
#include <assert.h>
#include <vector>
#include <boost/variant.hpp>
#include <boost/foreach.hpp>
using namespace std;
typedef boost::variant<int, std::string, double,char> valuetype;
/************************************************************************/
/* use boost::static_visitor */
/************************************************************************/
class print_visitor : public boost::static_visitor<void>
{
public:
void operator()(int& i)
{
std::cout << i << endl;
};
void operator()(string& str)
{
std::cout << str << endl;
};
void operator()(double& db)
{
std::cout << db << endl;
};
void operator()(char& cv)
{
std::cout << cv << endl;
}
};
void print_use_visitor (vector<valuetype>& coll)
{
print_visitor printer;
BOOST_FOREACH (valuetype& val, coll)
{
boost::apply_visitor (printer, val);
}
}
/************************************************************************/
/* use boost::get<> */
/************************************************************************/
void print(vector<valuetype>& coll)
{
BOOST_FOREACH(valuetype& val,coll)
{
if(int* intp = boost::get<int>(&val))
{
cout << *intp << endl;
}
if (string* sp = boost::get<string> (&val))
{
cout << *sp << endl;
*sp = "abcdefg";
}
if (double* dp = boost::get<double> (&val))
{
cout << *dp << endl;
}
}
}
/************************************************************************/
/* main */
/************************************************************************/
int _tmain(int argc, _TCHAR* argv[])
{
valuetype var;
var = "abc";
assert (boost::get<string> (&var) != 0);
vector<valuetype> coll;
coll.push_back (var);
coll.push_back (456);
coll.push_back (1.234);
coll.push_back ('a');
assert (coll.back().type() == typeid(char));
print (coll);
cout << "-------------------" << endl;
print_use_visitor (coll);
return 0;
}