C++ 代码生成的宏替代方案

Mar*_*lle 5 c++ macros coding-style

我的设置模块有一些冗余代码:

#include <QSettings>

class MySettings
{
public:
    // param1
    void setParam1(QString param1) { _settings.setValue("param1", param1); }
    string param1() { return _settings.value("param1").toString(); }

    // param2
    void setParam2(int param2) { _settings.setValue("param2", param2); }
    int param2() { _settings.value("param2").toInt(); }

    // param3
    void setParam3(int param3) { _settings.setValue("param3", param3); }
    int param3() { _settings.value("param3").toInt(); }

private:
    QSettings _settings;
}
Run Code Online (Sandbox Code Playgroud)

我设法通过使用宏减少了要编写的代码量。以下是QString参数类型的示例:

#define INTSETTING(setter, getter) \
    void set##setter(QString getter) { settings.setValue(#getter, getter);} \
    QString getter() {return settings.value(#getter).toString();}
Run Code Online (Sandbox Code Playgroud)

因为我使用的是 C++,所以我知道宏的使用是不好的。我正在寻找更清洁的替代品。

我给出了一个 Qt 示例(QString),但这是一个更一般的问题。

编辑:

宏使上述类的定义更加简单:

class MySettings
{
public:
    STRINGSETTING(Param1, param1)
    INTSETTING(Param2, param2)
    INTSETTING(Param3, param3)

    STRINGSETTING(DefaultTitle, defaultTitle)
    INTSETTING(MaxDocCount, maxDocCount)

private:
    QSettings _settings;
}
Run Code Online (Sandbox Code Playgroud)

cma*_*ter 8

您可以以宗教的方式回答这个问题,也可以回到旧原则:如果它使您的代码更具可读性,那就去做。

有很多人以宗教的方式回答这个问题,他们只是讨厌预处理器和与它有关的一切,并禁止在他们的代码中使用它。

另一方面,有些人经常定义宏来完成重复性任务,我已经多次这样做了,最常见的是定义一个宏以供在单个函数中使用(在 GNU 中定义子函数的方式很多) -C)。

我认为,人们对它的看法与人们goto对这句话的看法非常相似:大多数人认为它的用途是非妖魔化的,其他人则认为它有其积极的用途,不应将其视为邪恶。你需要自己决定这个。