首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将std::variant<A、B>转换为std::variant<A、B、C>

将std::variant<A、B>转换为std::variant<A、B、C>
EN

Stack Overflow用户
提问于 2019-11-24 02:04:17
回答 2查看 226关注 0票数 3

我有以下代码:

代码语言:javascript
复制
std::variant<A, B> foo();
std::variant<A, B, C> bar();
std::variant<A, B, C> foobar(bool a) {
    if (a) {
        return foo();
    } else {
        return bar();
    }
}

然而,这不能在gcc上编译:

代码语言:javascript
复制
error: could not convert ‘foo()’ from ‘variant<A, B>’ to ‘variant<A,B,C>’.

有没有一种很好的方法将std::variant<A, B>转换成std::variant<A, B, C>

EN

回答 2

Stack Overflow用户

发布于 2019-11-24 02:28:46

有没有一种很好的方法将std::variant<A, B>转换成std::variant<A, B, C>

不,我想是的。

我所能想象到的最好的方法是通过std::visit()

代码语言:javascript
复制
std::variant<A, B, C> foobar (bool a)
 {
   if (a) 
      return std::visit([](auto && val) -> std::variant<A, B, C>
                        { return {std::forward<decltype(val)>(val)}; },
                        foo());
   else
      return bar();
 }

更一般的解决方案可以是convVariant()函数

代码语言:javascript
复制
template <typename R, typename T>
R convVariant (T && t)
 {
   return std::visit([](auto && val) -> R
                        { return {std::forward<decltype(val)>(val)}; },
                        std::forward<T>(t));
 }

所以foobar()变成了

代码语言:javascript
复制
std::variant<A, B, C> foobar (bool a)
 {
   if (a) 
      return convVariant<std::variant<A, B, C>>(foo());
   else
      return bar();
 }
票数 1
EN

Stack Overflow用户

发布于 2019-11-24 02:31:18

原则上,标准可以允许从std::variant<T...>std::variant<U...>的隐式(如果保证成功)或显式(否则)转换,前提是前者中的所有类型至少在后者中出现的频率相同,因为存在明确和明显的映射。

不幸的是,它根本不是这样。

因此,您必须编写自己的函数来进行转换。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59010647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档