Препроцессор C ++: избегать повторения кода в списке переменных-членов
У меня есть несколько классов, каждый с различными переменными-членами, которые тривиально инициализируются в конструкторе. Вот пример:
struct Person
{
Person(const char *name, int age)
:
name(name),
age(age)
{
}
private:
const char *name;
int age;
};
У каждого есть связанныйprint<>()
функция.
template <>
void print<Person>(const Person &person)
{
std::cout << "name=" << name << "\n";
std::cout << "age=" << age << "\n";
}
Этот код подвержен ошибкам, поскольку список параметров реплицируется в четырех местах. Как я могу переписать код, чтобы избежать этого дублирования? Я хотел бы использовать препроцессор и / или шаблоны.
Например, могу ли я использовать технику препроцессора X-args - что-то вроде этого?
#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
Или лучше шаблонный подход?
Пожалуйста, не задавайте вопросов, почему я хочу это сделать, существуют обоснованные решения по проектированию, которые привели к появлению нескольких похожих объектов с именованными параметрами. Параметры должны быть именованы переменными-членами для повышения производительности. Я просто изучаю, возможно ли перечислить параметры и их типы только один раз.