连接 std::variant<a, b, c> 和 std::variant<x, y, z> 的类型

Bon*_*ero 7 c++

有没有办法从两个现有变体类型声明第三个变体,其中包含两个变体类型的并集?

#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)