Preprocesor C ++: unikaj powtarzania kodu listy zmiennych członkowskich

Mam wiele klas, każda z różnymi zmiennymi składowymi, które są inicjowane trywialnie w konstruktorze. Oto przykład:

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

Każdy ma powiązanąprint<>() funkcjonować.

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

Ten kod jest podatny na błędy, ponieważ lista parametrów jest replikowana w czterech miejscach. Jak mogę przepisać kod, aby uniknąć duplikacji? Chciałbym użyć preprocesora i / lub szablonów.

Na przykład, czy mogę użyć techniki preprocesora X-args - coś takiego?

#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

Lub lepiej, podejście oparte na szablonie?

Nie pytaj, dlaczego chcę to zrobić, istnieją uzasadnione decyzje projektowe, które doprowadziły do ​​powstania wielu podobnych obiektów o nazwanych parametrach. Parametry muszą być nazwane zmiennymi składowymi ze względu na wydajność. Badam tylko, czy możliwe jest jednorazowe wyświetlenie parametrów i ich typów.

questionAnswers(6)

yourAnswerToTheQuestion