【问题标题】:C++: Convert Macro based Property System to use templatesC++:将基于宏的属性系统转换为使用模板
【发布时间】: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


【解决方案1】:

这看起来像一个经典的游戏属性系统,所以我建议您阅读这篇Gamasutra 文章,了解一个不需要太多代码的好系统。也看看boost.fusion,看看它是否对你有帮助。

以下是我的观点,为了这个问题可以忽略:

也就是说,我不太确定使用模板会获得什么。仅仅是“宏不好”吗?

在使用过许多这样的系统后,我得出的结论是,您经常通过添加属性系统来解决错误的问题。如果可以,请考虑使用像 C# 这样的语言,其中属性是一流的语言特性。

【讨论】:

  • 我试过单声道/C#。不得不放弃它,因为它的非增量 GC 随机挂起。
  • 我的第一个实现使用字符串作为键,我没有任何问题。我将键切换为整数以获得更好的性能。
  • 我明白了。你试过真正的 C# 吗? Visual Studio Express 版本是“免费的”:microsoft.com/express/product。也就是说,我没有在一个项目中处理托管/非托管代码的经验。
  • 不幸的是,这必须在 Linux 上运行。
【解决方案2】:

即使有可能,您也可能会发现模板元编程是功能性的,这意味着像 COUNTER 这样的全局状态将不可用。这表明这个编译时库的“UI”可能很难看。您可能还会得到更糟糕的编译时间。

使用模板在功能上将一系列 id 链接在一起,您将获得单属性类型结构的类型列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多