在没有预编译器的情况下生成c ++类

时间:2014-05-30 23:42:23

标签: c++ visual-studio-2012 code-generation

我们的一个项目涉及为类生成样板代码。

例如,给定一个包含多个定义的文本文件,如:

STRUCT Foo
{
    int i;
    float f;
    string s;
}

Perl脚本将创建一个包含多个声明的头文件,如:

struct Type_Foo : BaseType
{
    int i;
    float f;
    string s;

    Generated_Foo();
    void clear();
    bool equals(Generated_Foo const&) const;
    string const* toTraceString() const;
    string const* toXmlString() const;
    string const* toJsonString() const;
    bool fromXmlString(char const*);
    bool fromJsonString(char const*);
};

以及带有实现的相应cpp文件。

我的问题是:

是否有可能在没有预编译器阶段的情况下获得类似的结果(模数语法差异)?

谢谢!

1 个答案:

答案 0 :(得分:1)

Boost.Preprocessor可以通过(ab)使用C / C ++预处理器来完成此操作。它可能看起来像这样。

#include <boost/preprocessor/seq/for_each.hpp>

#define STRUCT_MEMBER(r, data, elem) elem;

#define STRUCT(structname, seq) \
    struct Type_ ## structname : BaseType { \
        BOOST_PP_SEQ_FOR_EACH(STRUCT_MEMBER, _, seq) \
        Generated_ ## structname(); \
        void clear(); \
        bool equals(Generated_Foo const&) const; \
        string const* toTraceString() const; \
        string const* toXmlString() const; \
        string const* toJsonString() const; \
        bool fromXmlString(char const*); \
        bool fromJsonString(char const*); \
    }

STRUCT(Foo, (int i)(float f)(string s));

与Boost.Preprocessor合作后,我的观点是,虽然它非常酷,并且可以在C ++中完成所有工作,但对于非常重要的用途,它很快就会变得复杂。如果你已经有一个好的,有效的外部代码生成器(比如你的Perl脚本),那么继续使用它并没有错。