C ++ - Präprozessor: Vermeiden Sie Code-Wiederholungen der Member-Variablenliste

Ich habe mehrere Klassen mit jeweils verschiedenen Mitgliedsvariablen, die in einem Konstruktor trivial initialisiert werden. Hier ist ein Beispiel:

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

Jedem ist eine zugeordnetprint<>() Funktion.

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

Dieser Code ist fehleranfällig, da die Parameterliste an vier Stellen repliziert wird. Wie kann ich den Code umschreiben, um diese Duplizierung zu vermeiden? Ich möchte den Präprozessor und / oder die Vorlagen verwenden.

Könnte ich zum Beispiel die X-args-Präprozessor-Technik verwenden - so etwas?

#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

Oder besser, ein vorlagenbasierter Ansatz?

Bitte hinterfragen Sie nicht, warum ich dies tun möchte. Es gibt begründete Entwurfsentscheidungen, die zu mehreren ähnlichen Objekten mit benannten Parametern geführt haben. Die Parameter müssen aus Leistungsgründen Membervariablen genannt werden. Ich untersuche nur, ob es möglich ist, die Parameter und ihre Typen nur einmal aufzulisten.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage