我试图在c ++ 11中使用boost :: variant来创建它,但我不确定如何。 所以我有模板化类数据的结构<>
typedef boost::variant< data<A>,data<B>> dataVar;
存储在
中 std::map<string,dataVar> dataMap
如果我能以某种方式检索数据的类型,那将是很好的,所以我可以分配值,但我不知道如何使这项工作优雅
void registerDataFor(string str)
{
auto itr = dataMap.find(str);
if(itr == dataMap.end())
return;
dataVar = itr->second;
data<v.which()> itemData= boost::get<v.which()>(v);
someArray.push_back(itemData.getIntegerValue());
registerDataFor(itemData.getString());
}
由于模板括号需要静态类型,因此无法编译。
我看过其他提出访问者设计的回复,但我还需要数据类型&lt;&gt;得到这个项目。
答案 0 :(得分:4)
假设data<A>
和data<B>
都具有相同的界面,您可以将访问者struct
与template
operator()
一起使用:
struct registerImpl : boost::static_visitor<void>
{
template <typename T>
void operator()(T& x) const
{
someArray.push_back(x.getIntegerValue());
registerDataFor(x.getString());
}
};
void registerDataFor(std::string str)
{
auto itr = dataMap.find(str);
if(itr == dataMap.end())
return;
registerImpl visitor;
boost::apply_visitor(visitor, itr->second);
}
在C ++ 14中,您可以使用generic lambda访问变种 。
void registerDataFor(std::string str)
{
auto itr = dataMap.find(str);
if(itr == dataMap.end())
return;
boost::apply_visitor([](auto& x){
someArray.push_back(x.getIntegerValue());
registerDataFor(x.getString());
}, itr->second);
}
(如果您对使用lambdas和C ++ 14功能的变体访问感兴趣,我写了两篇关于它的文章:part 1和part 2。) < / p>