在给定一个 std::variant 类型的 C++ 中,是否可以添加其他类型来创建另一种变体类型?

Gra*_*tig 0 c++ using variant

#include <string>
#include <variant>

int main()
{
    using variant_base = std::variant< int, double >;

    using variant_derived_and_flattened = std::variant< std::string, variant_base >;
    // the above does not produce the desired
    // std::variant< int, double, std::string >
    static_assert( std::is_same< variant_base, variant_derived_and_flattened >{} );
}
Run Code Online (Sandbox Code Playgroud)

static_assert 失败。

我认为没有办法做到这一点,并希望对此进行确认,但也许有人知道如何做到这一点?

Bri*_*ian 6

您可以创建一个元函数来转换变体类型。

template <class V, class T> struct variant_append_helper;

template <class... A, class T>
struct variant_append_helper<std::variant<A...>, T> {
    using type = std::variant<A..., T>;
};

template <class V, class T>
using variant_append = typename variant_append_helper<V, T>::type;

static_assert(std::is_same<std::variant<int, double, std::string>,
                           variant_append<std::variant<int, double>, std::string>>{});
Run Code Online (Sandbox Code Playgroud)