我们的一个项目涉及为类生成样板代码。
例如,给定一个包含多个定义的文本文件,如:
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文件。
我的问题是:
是否有可能在没有预编译器阶段的情况下获得类似的结果(模数语法差异)?
谢谢!
答案 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脚本),那么继续使用它并没有错。