有某种条件的宏

时间:2010-12-23 17:41:56

标签: c++ macros c-preprocessor metaprogramming

我正在尝试创建一个宏,让我从某些打字中安全,并使其更好/更容易定义属性,这就是我的想法:

#define DefineProperty(Access, Type, Name) \
property<Access, Type> ##Name; \
void Set##Name(Type); \
Type Get##Name(void); \

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

这是否可能,例如使用元编程?

2 个答案:

答案 0 :(得分:5)

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

#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 */

答案 1 :(得分:0)

嗯,McNellis的答案相当简单明了。但是,如果你感兴趣的话,很有可能在使用模板元编程之后准确地构建你。去年我一直在改进图书馆,以便做到这一点。

我不能分享它,它是专有的而不是我拥有的。但我可以指出你发现最容易使用的方向。查看Abrahams和Gurtovoy的C ++ Template Metaprogramming 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;

我的系统实际上允许您定义这些属性由函数实现的对象。它虽然复杂得多,但我还没有找到将其简化到上述程度的方法。为此,我开始撰写一篇名为“通过模板元编程实现的反射支持”的文章,该文章已经在某个网上发布了......可能已经从ACM中删除了它。