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

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));



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值