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.