我有以下代码:
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>?
发布于 2019-11-24 02:28:46
有没有一种很好的方法将
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()变成了
std::variant<A, B, C> foobar (bool a)
{
if (a)
return convVariant<std::variant<A, B, C>>(foo());
else
return bar();
}发布于 2019-11-24 02:31:18
原则上,标准可以允许从std::variant<T...>到std::variant<U...>的隐式(如果保证成功)或显式(否则)转换,前提是前者中的所有类型至少在后者中出现的频率相同,因为存在明确和明显的映射。
不幸的是,它根本不是这样。
因此,您必须编写自己的函数来进行转换。
https://stackoverflow.com/questions/59010647
复制相似问题