用過c#或
com的人一定對屬性化程式設計不會陌生,至於屬性化程式設計的意義
,說實話我也看得不是很明白。但是單從物件導向的抽象上看「屬性
」至少應該有與方法同等的地位。舉例說明對於人這個抽象,我們為它定義類
「people」
。人都有七情六慾所以我們可以為它定義「喜
」、「笑
」、「怒
」、「罵
」等方法,當然人與人之間都不是千人一面的:頭髮的顏色、長短、粗細;眼睛的顏色、大小等等都是不一樣的,這些都是人人都有的區別於他人的特徵,是一種固有的屬性。它們與跑、跳等動作是有根本區別的。如果把這些屬性等同於方法,對映到程式**上就會出現一大堆
get/set
方法,的確這看起來有點滑稽。其實這裡最根本的錯誤在於混淆了物件發起的動作和與外界施加於物件上的動作
-------跑是「
那個人」
在跑,跳是
「那個人在跳
」;而他留著小分頭,她身材高挑都是
「我看到的」。
遺憾的是
c++對這層抽象不直接提供物件導向型別安全的支援。在網上看過一些人實現的屬性,都是採用了類似委託的方法定義乙個委託類
d,並宣告該委託類為某目標類的
a的公開欄位並在類
a的建構函式中初始化該委託類:
template
class d
;
class a
dage;
private:
void setage(int age);
int getage();
}
//!呼叫a
的**a a;
a.age = 99; /*<
哦很像c#
哦!*/
:&a:setage
」、「&a::getage
」繫結到某個自定義模板類上,我稱它為屬性原資料,當然原資料也是型別。原始碼如下:
//!型別推導輔助類,如果不這樣定義在一些情況下
vs2003
會出現內部編譯錯誤
template
structmemberfunctiontype
;
//!get
屬性原資料類模板定義
template
typename propertytype ,
typename memberfunctiontype::get get>/*!<
關鍵模板引數,在編譯期推導出繫結到屬性上的方法位址,在我看來方法位址是乙個編譯時常量。各位認同麼?由於沒有條件只在
vs2003
上測試通過
*/struct propertygetter
};
上面標紅**是關鍵部分,這樣的實現不會造成對建構函式的侵入更重要的是對方法位址的繫結完全是在編譯期完成的:
namespace
belinda
typedef
propertygetter
};
class
host:public
object
int
getnumber(char*)
virtual
string
getname(char*)
object& getobject(char*)
public:
host(int
i ):_data(i){};
public:
typedef
propertygsetter
typedef
propertygetter
};
//typedef memberfunctiontypeint2type<1> > member;
}
}
int_tmain(int
argc, _tchar* argv)
關於效能:由於建立了乙個臨時物件所以肯定有效能損失,但是在我的機子上執行
100000
次獲取屬性操作和直接呼叫方法的效能差別不大。
C 模板型別推導
內容參考 effective modern c 中的條款1 int x 27 const int cx x const int rx x const int p x 1.paramtype是個指標或引用,但不是個萬能引用 去引用不去const template void f t param f x ...
C 模板函式的型別推導
我在用泛型程式設計寫二維vector的排序模板時,寫出這樣乙個 vector的字典序比較,v1 v2是false templatebool cmp vector v1,vector v2 編譯結果 1 c program files x86 microsoft visual studio 10.0 ...
c 模板的型別推導 陣列
compile with c 11 include include include using namespace std templateint getsize t arg templateint getsize2 t arg int main int64 t arr2 cout type typ...