我正在尝试创建一个宏,这样我就不用输入了,并且可以更好/更容易地定义属性,这就是我的想法:
#define DefineProperty(Access, Type, Name) \
property<Access, Type> ##Name; \
void Set##Name(Type); \
Type Get##Name(void); \其中,Access是具有三个可能值的枚举: ReadOnly、WriteOnly和ReadWrite。只有当访问值适合于该方法时,才应定义宏中的方法。
这是不是有可能,比如使用元编程?
发布于 2010-12-24 01:47:08
是的,你可以很容易地做到这一点:
#define DefineGetReadOnly(Name, Type) Type Get##Name();
#define DefineGetReadWrite(Name, Type) Type Get##Name();
#define DefineGetWriteOnly(Name, Type)
#define DefineProperty(Access, Type, Name) \
DefineGet##Access(Name, Type)宏替换过程如下所示:
DefineProperty(ReadOnly, int, Foo)
DefineGetReadOnly(Foo, int)
int GetFoo();
DefineProperty(WriteOnly, int, Bar)
DefineGetWriteOnly(Bar, int)
/* no tokens */发布于 2010-12-24 02:33:06
好吧,McNellis的回答相当直接和简单。但是,如果您感兴趣,也可以在使用模板元编程之后构建您想要的内容。在过去的一年里,我一直在改进一个库来做这件事。
我不能全部分享,它是专有的,不归我所有。但我可以为您指出我发现的最容易使用的方向。查看亚伯拉罕和古托沃伊在C++模板元编程9.5中描述的技术。将其与boost::tuple和boost::fusion对象进行比较。请注意,您可以通过定义新类型来声明“名称”。因此,您可以创建一些您可能使用的东西,如下所示:
struct object_with_properties : construct_property_object< mpl::vector< mpl::pair< property<access,type>, name> ... > >::type
{};
object_with_properties owp;
get<name>(owp);
set<name>(owp, value);
// or maybe
get<name>(owp) = value;我的系统实际上允许你定义这样的对象,这些对象的属性是由函数实现的。然而,它要复杂得多,我还没有找到一种方法将它简化到上面的程度。为此,我从一篇名为“通过模板元编程来支持反射”的文章开始,这篇文章在网上发布,somewhere...might已经将其从ACM中拉了出来。
https://stackoverflow.com/questions/4521142
复制相似问题