用于多种结构体的函数对象
来源:互联网 发布:旅游 知乎 编辑:程序博客网 时间: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));
- 用于多种结构体的函数对象
- ## 用于结构体的定义
- 用于表示socket的结构体
- 用于表示socket的结构体
- 用于表示socket的结构体
- 实现一个可以用于bind2nd的函数对象
- 多种协议数据包的结构
- 标准库定义的函数对象--接“将函数对象用于标准库算法”
- redis list结构体中支持多种数据格式的实现
- 用于自定义数据/结构体的剪切板应用模板类
- 对象的多种创建方式
- 将函数对象用于标准库算法
- 函数和对象-用于调试,检查点
- IEtester资料整理,用于测试IE的多种浏览器
- Python帮助函数调试函数 用于获取对象的属性及属性值
- 包装外观(Wrapper Facade):用于在类中封装函数的结构型模式
- 包装外观(Wrapper Facade):用于在类中封装函数的结构型模式
- 包装外观(Wrapper Facade):用于在类中封装函数的结构型模式
- 指向数组的引用;指向数组的指针;指向类成员的指针;指向类数组成员的指针;二维字符串数组指针
- VC++.NET技术内幕学习一
- Activity栈简析
- 用程序输出一个小房子的程序
- asp.net的aspx 绑定 判断输出《转》
- 用于多种结构体的函数对象
- 解析VMware服务器虚拟化技术
- liunx pipe
- C#基础整理
- 简单爬虫中文乱码问题
- Mysql注释
- 九九乘法表(Java语言)
- 为 bash 转义文件名
- 如何理解LPCTSTR类型