【发布时间】:2020-07-30 07:39:58
【问题描述】:
我想知道是否有人知道创建重复类型声明的方法,因为这可能会造成混淆,所以一个示例会有所帮助:
对于我们的项目,我们需要有如下函数和类型声明:
using FunType = std::function<void(double,double,double,double,double,double,double,double)>;
using DataType = std::tuple<double,double,double,double,double,double,double,double>;
分散在多个文件中,多次,最多 32 个双精度数(仅双精度数,如果这很重要)。
我很乐意用以下虚构代码行中的内容替换这些双打的手动写入/计数:
using FunType = something_generate_function_decl<8>;
using DataType = something_generate_datatype_decl<8>
如果可能的话,我想远离 boost 及其预处理器库。
编辑以提供一些说明
总体情况是,在应用程序的某个时刻,我们得到一系列字节(表示一个双精度数组),每个值都具有预定义的含义,我们需要对它们进行验证(每个值都需要验证有几个有效性条件),拒绝无效数据,记录相应的无效数据及其含义,将有意义的数据传递给应用程序,从记录器模块到十几个不同的地方,包括现有的功能和已经定义的Qt信号语法等......在某些时候这会从我们手中消失,所以这就是为什么我想创建尽可能容易阅读和可验证的代码。
Edit2 提供更多说明
阅读 cmets,似乎对这个问题的范围有很多困惑。问题中故意遗漏了很多信息,这些信息与问题的纯粹本质无关,即如何将这 8 个(或 9 个、12 个或 32 个双打)缩短为更易于管理的实体。丢失的信息是我们处理接收到的数据的内部方式(我们有一个大规模的项目,因此您可以想象数据有几层抽象,可以进行自动验证、转换等......在发送之前,所以不是整个应用程序都是一长串 if/else 语句和带参数的基本函数调用),整个事情的唯一限制是作为一个简单的双精度数组(代表一条消息)出现的是验证然后发送到已经具有预定义接口的函数/QT 信号/C++11 lambda。所有信息处理和验证都封装在类层中,这些类只是在某处注册自己(超出此问题的范围)以接收、存储、验证和发送数据,例如,FunType(实际上是内部使用的消息类的类型)表示将发送特定消息(及其验证成员)的函数/插槽/lambdas的接口,通过某种机制自动将所有成员收集到一个元组中(DataType)并使用一些带有可变参数模板的index_sequence 魔术,编译器将元组匹配到所需的函数,该函数在某个时间点“订阅”了此消息。
@admin 如果您觉得此编辑不相关,请随时将其删除。
【问题讨论】:
-
使用双精度的 array 不是更好吗?
-
@DanielLangr 我们也尝试过,但是代码的可维护性在某些时候降到了零,所以我们决定制作一些人类可读的函数
-
std::array<double, 8>less 比double, double, double, double, double, double, double, double可维护性如何? -
@没用的考虑这个(不是真正的代码,只是示例):
void fun(std::array<double, 3> a) { if(a[0] > a[1] && a[1] < 90 && a[1] > 0 && a[3] > 0) fly(a[0], a[1], a[2]) }vs.void fun(double latitude, double longitude, double altitude) { if(latitude > longitude && longitude < 90 && longitude > 9 and altitude > 0) fly(longitude, latitude, altitude); }你更了解它的作用是哪一个? -
因此,您的问题中缺少的信息是 8 个(或 32 个)双精度不是平面的非结构化列表,而是实际上命名的变量。在这种情况下,您应该使用具有命名成员的结构,或者使用具有元组和命名 accessors 的结构。