Preprocesador de C ++: evitar la repetición de código de la lista de variables miembro

Tengo varias clases, cada una con diferentes variables miembro que se inicializan de forma trivial en un constructor. Aquí hay un ejemplo:

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

Cada uno tiene un asociado.print<>() función.

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

Este código es propenso a errores ya que la lista de parámetros se replica en cuatro lugares. ¿Cómo puedo reescribir el código para evitar esta duplicación? Me gustaría usar el preprocesador y / o plantillas.

Por ejemplo, ¿podría usar la técnica del preprocesador X-args, algo como esto?

#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

¿O mejor, un enfoque basado en plantillas?

Por favor, no cuestione por qué quiero hacer esto, hay decisiones de diseño razonadas que han resultado en múltiples objetos similares con parámetros nombrados. Los parámetros deben denominarse variables miembro por motivos de rendimiento. Solo estoy explorando si es posible enumerar los parámetros y sus tipos solo una vez.

Respuestas a la pregunta(6)

Su respuesta a la pregunta