无论出于什么原因,标准库都不支持它。
std::variant
这是一个非常漫长、非常有争议的过程。也许这一点在任何人的名单上都不算高?
添加这样一个转换构造函数和转换赋值运算符的唯一可能的技术问题是与当前构造函数的奇怪的病理性交互。马上
variant<Ts...>
有一个构造函数
T&&
它试图选择一个
Ts
对于这有可能发生冲突,你必须回答你想在这里发生什么的问题:
struct X { X(variant<int>); };
variant<int> v = 42;
variant<int, X> w = v;
目前,这是有效的,并且
w
持有
X
建造于
v
.你想让这件事改变吗
W
等一下
int
42
?
目前,您只需手动操作即可:
template <typename To, typename From>
To variant_cast(From&& from) {
return std::visit(
[](auto&& elem) { return To(std::forward<Elem>(elem)); },
std::forward<From>(from));
}
你不会得到那么好的语法(而且上面的实现对SFINAE不友好),但它完成了任务:
using V2 = variant<int, char>;
auto v2 = variant_cast<V2>(v1);
v2 = variant_cast<V2>(v1);
v2 = variant_cast<V2>(std::move(v1));
// at least this one is stil easy :-)
auto v3 = std::move(v2);