有没有办法从两个现有变体类型声明第三个变体,其中包含两个变体类型的并集?
#include <variant>
using Var1 = std::variant<int, bool>;
using Var2 = std::variant<float, double>;
// both lines should yield the same
using MergedVariant = VariantUnion<Var1, Var2>; // <-- how to do this?
using MergedVariant = std::variant<int, bool, float, double>; // expected
Run Code Online (Sandbox Code Playgroud)
lub*_*bgr 10
您可以使用这样的辅助类型来进行推导:
#include <variant>
template <class ...Args>
struct VariantUnionHelper;
template <class ...Args1, class ...Args2>
struct VariantUnionHelper<std::variant<Args1...>, std::variant<Args2...>> {
using type = std::variant<Args1..., Args2...>;
};
Run Code Online (Sandbox Code Playgroud)
加上方便的类型别名
template <class Variant1, class Variant2>
using VariantUnion = typename VariantUnionHelper<Variant1, Variant2>::type;
Run Code Online (Sandbox Code Playgroud)
这允许以下用例
using Var1 = std::variant<int, long, short>;
using Var2 = std::variant<bool, char, double>;
VariantUnion<Var1, Var2> joined;
Run Code Online (Sandbox Code Playgroud)
并通过以下编译时检查。
#include <type_traits>
static_assert(std::is_same_v<VariantUnion<Var1, Var2>,
std::variant<int, long, short, bool, char, double>>);
Run Code Online (Sandbox Code Playgroud)