gpt4 book ai didi

c++ - 如何检索模板类的 boost::variant 值

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:55 26 4
gpt4 key购买 nike

我正在尝试使用 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>有相同的界面,可以用访客structtemplate 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);
}

wandbox example


在 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);
}

wandbox example


(如果您对使用 lambda 和 C++14 功能的变体访问感兴趣,我已经写了两篇关于它的文章:part 1part 2。)

关于c++ - 如何检索模板类的 boost::variant 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40913489/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com