Pré-processador de C ++: evita a repetição de código da lista de variáveis ​​de membros

Eu tenho várias classes cada com diferentes variáveis ​​de membro que são inicializadas trivialmente em um construtor. Aqui está um exemplo:

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

Cada um tem um associadoprint<>() função.

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

Esse código é propenso a erros, pois a lista de parâmetros é replicada em quatro locais. Como posso reescrever o código para evitar essa duplicação? Eu gostaria de usar o pré-processador e / ou modelos.

Por exemplo, eu poderia usar a técnica de pré-processamento de X-args - algo assim?

#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

Ou melhor, uma abordagem baseada em modelos?

Por favor, não questione porque eu quero fazer isso, existem decisões de projeto fundamentadas que resultaram em vários objetos similares com parâmetros nomeados. Os parâmetros precisam ser denominados variáveis ​​de membro por motivos de desempenho. Estou apenas explorando se é possível listar os parâmetros e seus tipos apenas uma vez.

questionAnswers(6)

yourAnswerToTheQuestion