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

时间:2019-11-23 18:04:16

标签: c++ c++17

我有以下代码:

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上编译:

error: could not convert ‘foo()’ from ‘variant<A, B>’ to ‘variant<A,B,C>’.

是否有一种优雅的方法可以将std::variant<A, B>转换为std::variant<A, B, C>

2 个答案:

答案 0 :(得分:0)

  

是否有一种优雅的方法可以将var add3 = function add4(a,b){return a+b} add3(1,2) // 3 add4(1,2) // ReferenceError: add4 is not defined 转换为std::variant<A, B>

不,我想。

我能想象得到的最好的经历是std::variant<A, B, C>;像

std::visit()

更通用的解决方案可以是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()

所以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()

答案 1 :(得分:0)

原则上,如果前者中的所有类型至少在后者中发生的次数与前者相同,则该标准可以允许从std::variant<T...>std::variant<U...>的隐式(如果保证成功)或显式(否则)转换。有一个明确而明显的映射。

不幸的是,事实并非如此。

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