Препроцессор 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

Или лучше шаблонный подход?

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

Ответы на вопрос(6)

Ваш ответ на вопрос