Препроцессор C++: избегайте повторения кода в списке переменных-членов

У меня есть несколько классов, каждый из которых имеет разные переменные-члены, которые тривиально инициализируются в конструкторе. Вот пример:

struct Person
{
    Person(const char *name, int age)
        :
        name(name),
        age(age)
    {
    }
private:
    const char *name;
    int age;
};

У каждого есть связанная функция print<>().

template <>
void print<Person>(const Person &person)
{
    std::cout << "name=" << name << "\n";
    std::cout << "age=" << age << "\n";
}

Этот код подвержен ошибкам, поскольку список параметров дублируется в четырех местах. Как я могу переписать код, чтобы избежать этого дублирования? Я хотел бы использовать препроцессор и/или шаблоны.

Например, могу ли я использовать технику препроцессора X-args — что-то вроде этого?

#define ARGUMENTS \
    ARG(const char *, name) \
    ARG(int, age)

struct Person
{
    Person(LIST_TYPE_NAME_COMMA(ARGUMENTS))
       :
       LIST_NAME_INIT(ARGUMENTS)
    {
    }
private:
    LIST_TYPE_NAME_SEMICOLON(ARGUMENTS)
};

template <>
void print<Person>(const Person &person)
{
   LIST_COUT_LINE(ARGUMENTS)
}

#undef ARGUMENTS

Или, лучше, подход на основе шаблонов?

Пожалуйста, не спрашивайте, почему я хочу это сделать, есть обоснованные дизайнерские решения, которые привели к множеству похожих объектов с именованными параметрами. Параметры должны быть названы переменными-членами по соображениям производительности. Я просто изучаю, можно ли перечислить параметры и их типы только один раз.

60
задан Brian Tompsett - 汤莱恩 27 June 2016 в 16:05
поделиться