template<class T, class ValueType>
struct Cmp
{
ValueType T::*member_;
enum emMemberType {emInt, emStr, emSz, emIP} membertype_;
enum emOrderType {emAsc, emDesc} ordertype_;
Cmp(ValueType T::*m, emMemberType mt, emOrderType ot)
: member_(m), membertype_(mt), ordertype_(ot){}
bool operator () (T const& t1, T const& t2)
{
if (membertype_ == emInt)
{// 整数
if (ordertype_ == emAsc)
return (t1.*member_) < (t2.*member_);
else if (ordertype_ == emDesc)
return (t1.*member_) > (t2.*member_);
}
else if (membertype_ == emStr)
{// CString
if (ordertype_ == emAsc)
return StrCmpI(LPCTSTR((t1.*member_)), LPCTSTR((t2.*member_))) < 0;
else if (ordertype_ == emDesc)
return StrCmpI(LPCTSTR((t1.*member_)), LPCTSTR((t2.*member_))) > 0;
// 如果ValueType是int类型,因为编译的时候不能判断memebertype_的值,所以此处仍旧会
// 实例化" return StrCmpI(LPCTSTR((t1.*member_)), LPCTSTR((t2.*member_))) > 0;“函数,此处是依靠LPCTSTR将int*强转为const char*,所以
// 编译不会有问题,但如果用" return StrCmpI(t1.*member_, (t2.*member_) > 0;“就编译错误了,这等于给StrCmpI传递了一个int*的参数
}
else if (membertype_ == emSz)
{// 字符数组
if (ordertype_ == emAsc)
return StrCmpI(LPCTSTR(&(t1.*member_)), LPCTSTR(&(t2.*member_))) < 0;
else if (ordertype_ == emDesc)
return StrCmpI(LPCTSTR(&(t1.*member_)), LPCTSTR(&(t2.*member_))) > 0;
}
else if (membertype_ == emIP)
{// IP
if (ordertype_ == emAsc)
return (int)htonl(inet_addr(LPCSTR(&(t1.*member_)))) < (int)htonl(inet_addr(LPCSTR(&(t2.*member_))));
else if (ordertype_ == emDesc)
return (int)htonl(inet_addr(LPCSTR(&(t1.*member_)))) > (int)htonl(inet_addr(LPCSTR(&(t2.*member_))));
}
return true;
}
};
用法举例:
struct stru1
{
int a;
CString b;
TCHAR szE[10];
};
vector<stru1> v1;
sort(v1.begin(), v1.end(), Cmp<stru1, int>(&stru1::a, Cmp<stru1, int>::emInt, Cmp<stru1, int>::emDesc));
sort(v1.begin(), v1.end(), Cmp<stru1, TCHAR[10]>(&stru1::szE, Cmp<stru1, TCHAR[10]>::emSz, Cmp<stru1, TCHAR[10]>::emDesc));
sort(v1.begin(), v1.end(), Cmp<stru1, CString>(&stru1::b, Cmp<stru1, CString>::emStr, Cmp<stru1, CString>::emDesc));