如何检索模板化类的提升::变量值

How to retrieve a boost::variant value for a templated class

本文关键字:变量值 何检索 检索      更新时间:2023-10-16

我正在尝试使用 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());
}

这不会编译,因为模板括号需要静态类型。

我已经看到其他建议访问者设计的回复,但我还需要数据类型<>以获取该项目。

假设data<A>data<B>具有相同的界面,则可以使用带有templateoperator()的访问者struct

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 中,您可以使用通用 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);
}

魔杖盒示例


(如果您对使用 lambda 和 C++14 特征的变体访问感兴趣,我写了两篇关于它的文章:第 1部分和第2 部分