2009-09-07 48 views
1

我已經實現,使用宏,C++的屬性系統,該系統滿足以下要求:C++:基於產權制度轉換宏使用模板

  • 屬性可以使用integeral關鍵
  • 屬性引用可以通過一套通用的訪問/獲取
  • 屬性(和財產鍵)必須是可繼承
  • 性能可與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 /得到它(已經實現)

任何人都可以想到基於模板的方法是相當於/更簡單的上述系統?

注意:此屬性系統專爲遠程RPC電話以及快速本地訪問而設計。

+0

'__COUNTER__'是爲執行而保留的名稱,並且可以很好地使用這樣一個簡單的名稱。堅持_cOUNTER_或_jAMESZHAO00_COUNTER(等)是安全的。 – MSalters 2009-09-07 10:17:53

+1

__ COUNTER __是一個預定義的宏變量。 – jameszhao00 2009-09-07 12:47:22

回答

2

這看起來像一個經典的遊戲屬性系統,所以我要推薦你閱讀這篇Gamasutra關於一個好的系統的文章,它不需要太多的代碼。也看看boost.fusion,看看它是否不能幫助你。

以下是我的意見,並可以爲問題的緣故被忽略:

不過我真的不知道你會通過使用模板獲得什麼。這只是「宏是壞」嗎?

在與這些系統合作之後,我得出結論:您經常通過添加屬性系統來解決錯誤的問題。如果可以,請考慮使用C#等語言,其中屬性是一流的語言功能。

+0

我試過單聲道/ C#。不得不拋棄它,因爲它的非增量GC是隨機懸掛的。 – jameszhao00 2009-09-07 05:42:39

+0

我的第一個實現使用字符串作爲鍵,我沒有問題。爲了獲得更好的性能,我將鍵切換爲整數。 – jameszhao00 2009-09-07 05:45:58

+0

我明白了。你嘗試過真正的C#嗎? Visual Studio Express版本是「免費」的:http://www.microsoft.com/express/product/。這就是說我沒有經驗在一個項目中處理託管/非託管代碼。 – Justicle 2009-09-07 07:24:11

2

即使有可能,您可能會發現模板元編程功能正常,這意味着像COUNTER這樣的全局狀態將不可用。這暗示了這個編譯時庫的「UI」可能很難看。編譯時間可能會縮短。

使用模板在功能上將一系列ids鏈接在一起,您會得到一個單一屬性類型結構的類型列表。