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();
}