gpt4 book ai didi

c++ - 一般从 boost::variant 转换为类型

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:12:04 24 4
gpt4 key购买 nike

我有一个 typedef boost::variant<int, float, double, long, bool, std::string, boost::posix_time::ptime> variant我用它来在结构中存储不同类型的值。只有一个特定类型会存储在该结构中,但是我有这些结构的 vector ,我需要通过它并从变体中获取实际类型。

现在,当我需要将类型从这个变体中转换出来时,我会这样做:

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 具有所有类型的重载,上述内容就应该可以工作...

关于c++ - 一般从 boost::variant<T> 转换为类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4365747/

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