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

原创 2012年03月31日 11:47: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));



版权声明:本文为博主原创文章,未经博主允许不得转载。

C++基础---结构体(struct)

1. 结构体(struct) 1.1 结构体的概念 结构体(struct):是由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构。 结构体(struct):是一种复合数据类型,结构类型。...
  • cainv89
  • cainv89
  • 2015年10月12日 01:19
  • 6338

memcpy-结构体的复制

一、 一个memcpy的结构体的复制,类似于C++中调用类的拷贝构造函数,用一个对象去初始化另一个对象! #include "stdio.h" #include "string.h" ...
  • yu704645129
  • yu704645129
  • 2014年11月24日 14:20
  • 3543

C++对象的构造函数和析构函数详解

 C++对象的构造函数和析构函数详解 你好,C++(33)对象生死两茫茫 6.2.3 一个对象的生与死:构造函数和析构函数 6.2.2  使用类创建对象 完成某个类的声明并且定义其成员函...
  • mynote
  • mynote
  • 2015年03月18日 12:23
  • 1090

C语言里用结构体和指针函数实现面向对象思想

一、基础研究 观察如下两个程序a.c和b.c: A.c:   B.c:     这两个程序都是要实现在屏幕上第10行40列打印一个绿色的字符c:   ...
  • huangchong2995
  • huangchong2995
  • 2017年01月03日 17:09
  • 123

C++小课堂--第一期---面向对象之前 --- 实现函数返回结构体,实现大数据的传输

即将开启C++学习之旅,是时候该说些什么了; 好了话不多说,上代码: #include using namespace std; struct course{ double math; ...
  • happylaoxu
  • happylaoxu
  • 2015年04月07日 13:35
  • 296

C语言里用结构体和指针函数实现面向对象思想

转自:http://www.linuxidc.com/Linux/2016-12/138789.htm 一、基础研究 观察如下两个程序a.c和b.c: A.c:   B....
  • shenhuan1104
  • shenhuan1104
  • 2018年01月11日 14:26
  • 47

JNI调用c++函数,该函数的参数是结构体(——对象的传递)

第三方C++函数接口为 int api_get_logfile(Struct fileinfo tfile),参数是个结构体,且套了另一个结构体: struct fileinfo{  char...
  • haoruifly
  • haoruifly
  • 2012年03月05日 21:09
  • 3792

JNI调用c++函数,该函数的参数是结构体(——对象的传递)

第三方C++函数接口为 int api_get_logfile(Struct fileinfo tfile),参数是个结构体,且套了另一个结构体: struct fileinfo{  char *fu...
  • sinat_29384657
  • sinat_29384657
  • 2017年08月09日 15:50
  • 146

面向对象编程常见分类(类,结构体,事件,委托,枚举)

  • 2018年01月12日 10:09
  • 248KB
  • 下载

C-042.结构体类型的基本概念以及初始化的多种方式

构造类型:由已有的数据类型构成类型 1、数组:多个同种类型的数据构成的那么一种类型       特点:只能存放一种数类型 2、结构体:从来存放表示某种特定含义的一组数据       特...
  • longpapa
  • longpapa
  • 2015年12月05日 14:41
  • 142
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用于多种结构体的函数对象
举报原因:
原因补充:

(最多只允许输入30个字)