可完美替换掉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;
}
本文介绍如何利用Boost库中的variant和static_visitor来替代C语言中的union,实现对不同数据类型的统一处理,包括整型、字符串、浮点型和字符型。通过实例展示了如何在循环中获取并打印这些数据类型,以及使用get函数获取特定类型的值并进行操作。重点突出了Boost库在简化数据类型处理方面的强大功能。
403

被折叠的 条评论
为什么被折叠?



