是否可以将结构分组以用于 std::variant
Is it possible to group structs for use with std::variant
我正在设计一个 class 来使用 std::variant
表示来自 10 多个来源的数据。每个来源可能有 10 条不同的消息,因此变体将代表 100 种不同的底层结构。
可以理解,我想声明 std::variant
而没有在声明中列出 100 种类型:
std::variant<Type1, Type2, Type3............................ Type100>
我更愿意将每个 'source' 的 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>;
这里需要注意的是,您有两个级别的变体(用于访问)。
您可以为 flatten/concatenate 变体创建特征:
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, Source1Types, .., Source9Types>;
我正在设计一个 class 来使用 std::variant
表示来自 10 多个来源的数据。每个来源可能有 10 条不同的消息,因此变体将代表 100 种不同的底层结构。
可以理解,我想声明 std::variant
而没有在声明中列出 100 种类型:
std::variant<Type1, Type2, Type3............................ Type100>
我更愿意将每个 'source' 的 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>;
这里需要注意的是,您有两个级别的变体(用于访问)。
您可以为 flatten/concatenate 变体创建特征:
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, Source1Types, .., Source9Types>;