有没有人试图创建一组自动创建具有任意成员变量集的类的宏,然后添加对序列化的支持?
例如,我希望能够编写包含以下代码的文件:
GENERATED_CLASS(MyClass)
GENERATED_CLASS_MEMBER(int, foo);
GENERATED_CLASS_MEMBER(std::string, bar);
END_GENERATED_CLASS();
GENERATED_CLASS(MySecondClass)
GENERAGED_CLASS_MEMBER(double, baz);
END_GENERATED_CLASS();
GENERATED_DERIVED_CLASS(MyClass, MyThirdClass)
GENERATED_CLASS_MEMBER(bool, bat);
END_GENERATED_CLASS();
有效地导致
class MyClass
{
public:
MyClass() {};
~MyClass() {};
void set_foo(int value) { foo = value; }
void set_bar(std::string value) { bar = value; }
int get_foo() { return foo; }
std::string get_bar() { return bar; }
private:
int foo;
std::string bar;
};
std::ostream& operator<<(std::ostream& os, const MyClass& obj)
{
/* automatically generated code to serialize the obj,
* i.e. foo and bar */
return os;
}
std::istream& operator>>(std::istream& os, MyClass& obj)
{
/* automatically generated code to deserialize the obj,
* i.e. foo and bar */
return os;
}
class MySecondClass
{
public:
MySecondClass() {};
~MySecondClass() {};
void set_baz(double value) { baz = value; }
double get_baz() { return baz; }
private:
double baz;
};
std::ostream& operator<<(std::ostream& os, const MySecondClass& obj)
{
/* automatically generated code to serialize the obj,
* i.e. baz */
return os;
}
std::istream& operator>>(std::istream& os, MySecondClass& obj)
{
/* automatically generated code to deserialize the obj,
* i.e. baz */
return os;
}
class MyThirdClass : public MyClass
{
public:
MyThirdClass() {};
~MyThirdClass() {};
void set_bat(bool value) { bat = value; }
bool get_bat() { return bat; }
private:
bool bat;
};
std::ostream& operator<<(std::ostream& os, const MyThirdClass& obj)
{
/* automatically generated code to serialize the obj,
* i.e. call the << operator for the baseclass,
* then serialize bat */
return os;
}
std::istream& operator>>(std::istream& os, MyThirdClass& obj)
{
/* automatically generated code to deserialize the obj,
* i.e. call the << operator for the baseclass,
* then serialize bat */
return os;
}
从预编译器生成。
我只是不确定最好的方法。我并不反对使用可变参数模板和可变参数宏,如果有人可以告诉我如何,但我非常想避免使用boost,编写我自己的预处理器,添加任何自定义makefile魔法等来实现这一点 - 如果可能的话,纯c ++解决方案。
有什么建议吗?