我可以只使用声明生成一个简单的构造函数吗?

Dav*_*d Z -1 c++ constructor instance-variables c-preprocessor

我有一个包含许多实例变量的类:

class Data {
public:
    const double a, b, c, d;
    const size_t e, f, g, h, i, j;
    const std::string s;
    // and so on
    double Q, Z;
    Data(const double a, const double b, ...);
};
Run Code Online (Sandbox Code Playgroud)

以及代码中其他地方的一些相当复杂的逻辑,它们计算所有这些字段应该具有的值,然后创建一个Data对象.

double a = ...;
double b = ...;
// and so on, but not for Q and Z
Data data_instance(a, b, c, d, e, f, g, h, i, j, s, ...);
Run Code Online (Sandbox Code Playgroud)

的值QZ计算在构造,作为其他值的函数.我是这样做的,因为实例Data是不可变的,我希望这些字段可以const帮助编译器强制执行此操作.

据我所知,这需要我定义一个构造函数

Data::Data(const double a, const double b, ...) : a(a), b(b), ... {}
Run Code Online (Sandbox Code Playgroud)

这不是一个真正的问题,但是有大约35个字段,这是很多非常公式化的代码,原则上可以自动生成.有没有什么方法可以利用C++语法或预处理器来做到这一点?具体来说,我想以某种形式给出字段列表一次,并且具有声明,构造函数中的参数以及构造函数中的初始化器全部自动生成.这样,当我必须向类中添加一个新字段时(我不时需要这样做,因为我添加新功能),我只需要记住在一个地方添加新字段.

或者const完全抛弃正确性的想法可能会更好吗?如果我这样做,我可以Data data_instance()使用默认构造函数创建,然后计算值并将它们直接分配给它的字段.这样我只需要声明变量,而不是在构造函数中初始化它们.(如果我可以,比方说,将字段标记为const但是以某种方式使它们仍然能够在构造函数的主体中进行修改,这对我来说很有用.)

seh*_*ehe 5

如果这只是一个简单的数据"持有者",请考虑将其改为聚合.

struct Data { // class works equally well...
    double a, b, c, d;
    size_t e, f, g, h, i, j;
    std::string s;
};
Run Code Online (Sandbox Code Playgroud)

现在你使用它:

Data const d { 0,1,2,3, 111,222,333,444,555,666, "hello world" };
Run Code Online (Sandbox Code Playgroud)

注意d.sa是如何的std::string const&,因为它const分布在实例的成员中.