我正在尝试创建一个宏,让我从某些打字中安全,并使其更好/更容易定义属性,这就是我的想法:
#define DefineProperty(Access, Type, Name) \
property<Access, Type> ##Name; \
void Set##Name(Type); \
Type Get##Name(void); \
其中Access是具有三个可能值的枚举:ReadOnly,WriteOnly和ReadWrite。只有在访问值适合该方法时,才应定义宏中的方法。
这是否可能,例如使用元编程?
答案 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中删除了它。