私はこれらのものをかなり長い間見てきましたが、それらは非常に扱いにくい傾向があります。それらは、継承の使用や奇妙なコンストラクターなどの使用を妨げる可能性があります。最終的には、利便性ではなく負担が大きすぎます。
私が現在使用しているメンバーを公開するためのこのアプローチは非常に軽量であり、たとえば、シリアル化のクラスを探索したり、「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 << " ";
}
}