使用宏使用任意成员变量生成c ++类

时间:2014-10-09 20:45:00

标签: c++ class templates macros variadic

有没有人试图创建一组自动创建具有任意成员变量集的类的宏,然后添加对序列化的支持?

例如,我希望能够编写包含以下代码的文件:

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 ++解决方案。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

几乎完全符合您要求的解决方案之一是google protocol buffers。它允许您以特定格式(IDL)定义结构,然后生成c ++代码(类,序列化等)。