C++ 转换标准::变量<;A、 B>;至标准::变体<;A、 B、C>;

C++ 转换标准::变量<;A、 B>;至标准::变体<;A、 B、C>;,c++,c++17,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(); } } std::variant foo(); std::variant bar(); 标准:变型foobar

我有以下代码:

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();
    }
}
std::variant foo();
std::variant bar();
标准:变型foobar(布尔a){
如果(a){
返回foo();
}否则{
返回杆();
}
}
但是,这不会在gcc上编译:

error: could not convert ‘foo()’ from ‘variant<A, B>’ to ‘variant<A,B,C>’.
错误:无法将'foo()'从'variant'转换为'variant'。
是否有一种优雅的方式将
std::variant
转换为
std::variant

是否有一种优雅的方式将
std::variant
转换为
std::variant

不,我想

我能想象的最好的方式是通过
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();
 }
所以
foobar()
been

std::variant<A, B, C> foobar (bool a)
 {
   if (a) 
      return convVariant<std::variant<A, B, C>>(foo());
   else
      return bar();
 }
std::variant foobar(bool a)
{
如果(a)
返回convVariant(foo());
其他的
返回杆();
}

原则上,如果前者中的所有类型在后者中出现的频率与后者相同,且存在明确和明显的映射,则该标准可以允许从
std::variant
std::variant
的隐式(如果保证成功)或显式(否则)转换

不幸的是,事实并非如此


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

@Ripi2:这不起作用<代码>变体不能转换为其他类型的
变体
std::variant
不是
std::variant
。不同类型。为什么你会认为你可以在他们中间投?记住:演员阵容不能转换任何东西。它只是通过不同的眼镜重新解释位。请注意,这里合适的术语是convert(如错误消息中所示),而不是cast。强制转换是您在源代码中编写的命令编译器进行转换的内容。@PeteBecker我将“强制转换”更改为“转换”。该答案的可能重复项
variant\u cast(foo())
工作正常
std::variant<A, B, C> foobar (bool a)
 {
   if (a) 
      return convVariant<std::variant<A, B, C>>(foo());
   else
      return bar();
 }