c++ - 是否可以对结构进行分组以与 std::variant 一起使用
问题描述
我正在设计一个类来表示来自 10 多个来源的数据,使用std::variant
. 每个源可能有 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, Source1Types, .., Source9Types>;
推荐阅读
- rxjs - RxJS:有条件地重复 AJAX 并响应先前的结果
- android - 这条线是否重要:“应用插件:'com.google.gms.google-services'”应该在底部?
- java - 在 Java 中创建一个简单的 Restful api
- android - 既然不允许后台任务,那么处理图片上传的正确方法是什么?
- cmake - 如何将 Cublas 库与 CMake CUDA 10.0 Ubuntu 18 链接
- azure - AI(内部):达到消息限制。EventSource 错误消息结束
- django - Django 登录到 wxpython 窗口?
- symfony4 - Api平台错误处理异常?
- dictionary - ansible - 组合三个字典列表
- fortran - 是否可以将 Fortran 派生数据类型指针指向内在数据类型?