C 使用模版實現按成員變數或者成員函式排序

2021-06-12 08:54:44 字數 1520 閱讀 6207

例如有乙個這樣的類:

class ca

ca(int a, int b):m_a(a),m_b(b){}

int m_a;

int m_b;

int func1()

double func2( )

};

有乙個該類的list:

std::listlista;
現在不同場合需要根據成員變數m_a進行排序,有時需要根據m_b排序,有時還需要根據func1的返回值進行排序。為了實現這個功能,折騰了兩個模版類。

templateclass ccmptt

;templateccmptt::ccmptt(t1 t2::*ptr)

templatebool ccmptt::operator()(t2 v1, t2 v2)

#define get_cmpbymembervalue(classtype, membertype, member) (ccmptt(&classtype::member))

templateclass ccmpttfunc

;templateccmpttfunc::ccmpttfunc(t1 (t2::*ptr)())

templatebool ccmpttfunc::operator()(t2 v1, t2 v2)

#define get_cmpbymemberfunc(classtype, funcrettype, func) (ccmpttfunc(&classtype::func))

這兩組模版和巨集定義分別實現了按照某個類的成員變數或者函式獲得比較函式。使用方法如下:

lista.sort( get_cmpbymembervalue(ca, int, m_a));

lista.sort( get_cmpbymembervalue(ca, int, m_b));

lista.sort( get_cmpbymemberfunc(ca, int, func1));

lista.sort( get_cmpbymemberfunc(ca, double, func2));

繼續改進: 經陳啟華同學建議,不要使用巨集,使用模版函式會更簡單:

templateccmpttget_cmp( t1 t2::*ptr) 

templateccmpttfuncget_cmpbyfunc( t1 (t2::*ptr)() )

使用如下:

lista.sort( get_cmp(&ca::m_a));

lista.sort( get_cmp(&ca::m_b));

lista.sort( get_cmpbyfunc(&ca::func1));

lista.sort( get_cmpbyfunc( &ca::func2 ));

todo: 增加到但引數的成員函式的支援。

c 常問問題七 成員變數包含引用型別或者常量

成員變數裡面如果包含了引用型別,應該如何初始化此成員變數才不報錯 答 需要利用類的初始化列表來構造該成員物件 class dog1 string m strname class cat1 dog1 m friend int m nfriendcnt void main 這裡用了兩種方法初始引用型別的...

oc82 成員變數使用copy修飾

import typedef void myblock inte ce person nsobject property nonatomic,retain nsstring name property nonatomic,copy nsstring name 注意 如果是block使用copy並不是...

oc82 成員變數使用copy修飾

import typedef void myblock inte ce person nsobject property nonatomic,retain nsstring name property nonatomic,copy nsstring name 注意 如果是block使用copy並不是...