是否可以将结构分组以用于 std::variant

问题描述

我正在设计一个类来使用 std::variant 表示来自 10 多个来源的数据。每个源可能有 10 个不同的消息,因此变体将代表 100 个不同的底层结构。

可以理解,我想声明 std::variant 而不在声明中列出 100 种类型:

std::variant<Type1,Type2,Type3............................ Type100>

我更愿意对每个“源”的 10 个结构进行分组,variant 由这些组组成:

std::variant<Source1Types,Source2Types.... Source10Types>

有没有办法对结构进行分组,以便与 std::variant 一起使用?如果没有,还有其他方法可以实现吗?

(我使用的是 C++20)

解决方法

你可能会这样做:

using Source0Types = std::variant<Type0,Type1,Type2,Type3,..,Type9>;
using Source1Types = std::variant<Type10,Type11,Type12,Type13,Type19>;
// ..

using SourceTypeVariant = std::variant<Source0Types,Source1Types,Source9Types>;

这里需要注意的是,您有两个级别的变体(用于访问)。

您可以创建特征来展平/连接变体:

template <typename ... Vs> struct concatenate;
template <typename ... Vs> using concatenate_t = typename concatenate<Vs...>::type;

template <typename ... Ts> struct concatenate<std::variant<Ts...>>
{
    using type = std::variant<Ts...>;
};

template <typename ... Ts,typename ... Us,typename ... Vs>
struct concatenate<std::variant<Ts...>,std::variant<Us...>,Vs...> :
    concatenate<std::variant<Ts...,Us...>,Vs...>
{
};

所以

using MegaVariant = concatenate_t<Source0Types,Source9Types>;