我有一个typedef boost :: variant< int,float,double,long,bool,std :: string,boost :: posix_time :: ptime>我用来在结构中存储不同类型的值的变体.只有一个特定类型将存储在该结构中,但是我有一个这些结构的向量,我需要通过该向量并从变量中获取实际类型.
现在,当我需要进行转换时,我会这样做:
variant second = mystruct.variant; if (second.which() == 5) //string { std::string val = boost::get<std::string>(second); modvalue->AddNodeAttribute(key,val); } else if (second.which() == 0) //int { int val = boost::get<int>(second); modvalue->AddNodeAttribute(key,val); } else if (second.which() == 2) //double { double val = boost::get<double>(second); modvalue->AddNodeAttribute(key,val); } else if (second.which() == 1) //float { float val = boost::get<float>(second); modvalue->AddNodeAttribute(key,val); } else if (second.which() == 3) // long { long val = boost::get<long>(second); modvalue->AddNodeAttribute(key,val); } else if (second.which() == 4) // bool { bool val = boost::get<bool>(second); modvalue->AddNodeAttribute(key,val); } else if (second.which() == 6) // posix::time { boost::posix_time::ptime ptm = boost::get<boost::posix_time::ptime>(second); modvalue->AddNodeAttribute(key,ptm); }
我想知道是否有更通用的方法我可以通过编写一个采用变量的通用函数和一个返回值类型T来解决这个问题.但是当我这样做时,我仍然必须编写类似的if语句来解释每种类型的T.
所以类似于FromVariant< int>(var);但是我仍然需要为我的变体中的每个类型执行此操作.
因此,我的通用解决方案似乎并没有减少我的代码,而是增加了代码,这显然不是重点.我想知道是否有人有一个更优雅的解决方案来获取我的变体中的各种类型,这是一些通用的,我可以只调用一个函数给出我想要的类型?
解决方法
实际上看一下你的代码,这里有一个不同的选择 – 再次基于使用访问者..
struct add_node_visitor : boost::static_visitor<> { add_node_visitor(<type of modvalue> & node,<type of key> & key) : _node(node),_key(key) {} template <typename _Item> void operator()(_Item const& item) { node->AddNodeAttribute(_key,item); } <type of modvalue> & _node; <type of key> & _key; }
使用:
boost::apply_visitor (add_node_visitor(modmodvalue,key),mystruct.variant);
只要你的AddNodeAttribute对所有类型都有重载,上面应该有效……