【发布时间】:2009-09-07 04:18:43
【问题描述】:
我已经使用宏实现了一个满足以下要求的 C++ 属性系统:
- 可以使用整数键引用属性
- 可以通过通用 Set/Get 访问属性
- 属性(和属性键)必须是可继承的
- 可以使用 getter/setter 注册属性
并实现如下
- 每个属性都属于一个类
- 每个属性都使用其继承链唯一的键“声明”。 (使用相当聪明的 __ COUNTER __ hack 实现)。它具有以下特点
- 根类(无父类)的属性从 0 开始编号
- 子类将从父类的最后一个 id + 1 开始对其属性进行编号
class A
{
static const unsigned int Property_0 = GET_KEY_MACRO; //expands to 0
static const unsigned int Property_1 = GET_KEY_MACRO; //expands to 1
};
class B : public A
{
static const unsigned int Property_0 = GET_KEY_MACRO(A); //expands to 2
//and so forth
};
class C : public A
{
static const unsigned int Property_0 = GET_KEY_MACRO(A); //expands to 2. different inheritance chain
};
- 其他代码可以使用静态常量id来引用属性。
objectinstance.SetValue(C::Property_0, 5)
- 使用扩展为虚拟方法的宏“注册”每个属性。该宏目前允许注册属性类型、getter 和 setter
BEGIN_PROPERTIES
REG_PROP(Property_0, int)
REG_PROP_G(Property_1, int, getterFunc)
...
END_PROPERTIES
//expands to
virtual void registerProperties()
{
register(blah, blah, ...)
}
- SetValue/GetValue 采用属性键并执行一些后台魔法来设置/获取它(已实现)
谁能想到与上述系统等效/更简单的基于模板的方法?
注意:此属性系统专为远程 RPCish 调用以及快速本地访问而设计。
【问题讨论】:
-
__COUNTER__是为实现保留的名称,使用这样一个简单的名称很可能会被采用。坚持使用 cCOUNTER 或 _jAMESZHAO00_COUNTER (etc) 以确保安全。 -
__ COUNTER __ 是一个预定义的宏变量。
标签: c++ design-patterns templates properties macros