Я смотрел на эти вещи довольно долго, но они, как правило, очень жесткие. Они могут помешать вам использовать наследование или иметь странные конструкторы и т. Д. И т. Д. В конце концов они оказались слишком обременительными, а не удобными.
Этот подход для демонстрации членов, который я сейчас использую, довольно легкий и позволяет вам исследовать класс для сериализации или установки, например, всех полей с именем "x" в 0. Это также статически определено, поэтому очень, очень быстро. Нет слоев библиотечного кода или кода поколения, чтобы беспокоиться о путанице с процессом сборки. Обобщает иерархии вложенных типов.
Установите в вашем редакторе несколько макросов, чтобы автоматизировать написание некоторых из этих вещей.
struct point
{
int x;
int y;
// add this to your classes
template <typename Visitor>
void visit(Visitor v)
{
v->visit(x, "x");
v->visit(y, "y");
}
};
/** Outputs any type to standard output in key=value format */
struct stdout_visitor
{
template <typename T>
void visit(const T& rhs)
{
rhs.visit(this);
}
template <typename Scalar>
void visit (const Scalar& s, const char* name)
{
std::cout << name << " = " << s << " ";
}
}