我可以将 std::variant<Ts...> 分配给/从 std::variant<Ts..., Ys...> 分配/构造一个 std::variantTs... 吗?
Can I assign/construct an std::variant<Ts...> to/from an std::variant<Ts..., Ys...>?
在我看来,将苹果或橙子的东西分配给可能是苹果、橙子或草莓的东西是明确的。
那为什么,我不能这样做呢?
#include <variant>
int main()
{
std::variant<int> v1{42};
std::variant<int, char> v2{v1}; // copy construction
v2 = v1; // copy assignment
v2 = std::move(v1); // move assignment
std::variant<int, char> v3{std::move(v2)}; // move construction
}
从概念上讲,这似乎没问题。甚至 boost::variant 也允许它(即使 std 和 boost variant 不完全是同一个野兽)。我找不到缺陷报告或提案,所以我可能错过了一些不允许C++黑暗角落的原因。
无论出于何种原因,标准库中都不支持它。 std::variant
是一个非常漫长、非常有争议的过程。也许这个特定方面在任何人的名单上都不高?
添加这样的转换构造函数和转换赋值运算符的唯一可能的技术问题是与当前构造函数的奇怪病理交互。现在,variant<Ts...>
有一个构造函数,它试图选择一个Ts
T&&
。这有可能发生冲突,你必须回答你想在这里发生什么的问题:
struct X { X(variant<int>); };
variant<int> v = 42;
variant<int, X> w = v;
目前,这是有效的,并且w
持有由v
构造的X
。您是否希望这种情况改变并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);
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么 std::unique 不调用 std::sort?
- 我可以将 std::variant<Ts...> 分配给/从 std::variant<Ts..., Ys...> 分配/构造一个 std::variantTs... 吗?
- 并发 TS: std::future<...>::那么,如何在不存储返回的未来的情况下保持链的活动?