用于多种结构体的函数对象

来源:互联网 发布:旅游 知乎 编辑:程序博客网 时间:2024/06/06 06:41
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));



原创粉丝点击