我有以下代码:
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>
?
答案 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...>
的隐式(如果保证成功)或显式(否则)转换。有一个明确而明显的映射。
不幸的是,事实并非如此。
因此,您必须编写自己的转换函数。