首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有某种条件的宏

带有某种条件的宏
EN

Stack Overflow用户
提问于 2010-12-24 01:41:56
回答 2查看 833关注 0票数 0

我正在尝试创建一个宏,这样我就不用输入了,并且可以更好/更容易地定义属性,这就是我的想法:

代码语言:javascript
复制
#define DefineProperty(Access, Type, Name) \
property<Access, Type> ##Name; \
void Set##Name(Type); \
Type Get##Name(void); \

其中,Access是具有三个可能值的枚举: ReadOnly、WriteOnly和ReadWrite。只有当访问值适合于该方法时,才应定义宏中的方法。

这是不是有可能,比如使用元编程?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-24 01:47:08

是的,你可以很容易地做到这一点:

代码语言:javascript
复制
#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)

宏替换过程如下所示:

代码语言:javascript
复制
DefineProperty(ReadOnly, int, Foo)
DefineGetReadOnly(Foo, int)
int GetFoo();

DefineProperty(WriteOnly, int, Bar)
DefineGetWriteOnly(Bar, int)
/* no tokens */
票数 5
EN

Stack Overflow用户

发布于 2010-12-24 02:33:06

好吧,McNellis的回答相当直接和简单。但是,如果您感兴趣,也可以在使用模板元编程之后构建您想要的内容。在过去的一年里,我一直在改进一个库来做这件事。

我不能全部分享,它是专有的,不归我所有。但我可以为您指出我发现的最容易使用的方向。查看亚伯拉罕和古托沃伊在C++模板元编程9.5中描述的技术。将其与boost::tuple和boost::fusion对象进行比较。请注意,您可以通过定义新类型来声明“名称”。因此,您可以创建一些您可能使用的东西,如下所示:

代码语言:javascript
复制
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中拉了出来。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4521142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档