1、仿函數的概念
仿函數是一個是通過重載()運算符模擬函數形為的類。
2、實現方法
下面是一個簡單的實現方法:
//看看字符串是否小於一個長度 class Test{ public: explicit Test(int lenth) : len(lenth){} bool operator() (const QString& str) const{ return str.length() < len; } private: const int len; }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QString str = "abcde"; int len1 = str.length()-1; int len2 = str.length()+1; //使用方法1 qDebug()<<Test(len1)(str)<<endl; //使用方法2 Test t(len2); qDebug()<<t(str)<<endl; return a.exec(); }
3、仿函數的應用場景
對於上面應用,很明顯,可以簡單定義一個比較的函數,用來處理字符長度的比較工作。因此,如果想要利用仿函數,一定是需要用到仿函數類的功能,譬如:仿函數類定義的時候,可以傳遞一個參數,()操作的時候,也可以傳遞參數,兩種參數有作用優先級的時候,可以考慮這種使用方法。下面實現一個簡單工廠模式:
class Operation { public: int a = 0; int b = 0; Operation(int ia,int ib){ a = ia; b = ib; } public: virtual bool GetResult(int) =0; }; class OperateIn:public Operation { public: OperateIn(int ia,int ib): Operation(ia, ib) {} //判斷輸入的i是否在 a和b 之間 bool GetResult(int i) { if(i>a && i<b) return true; return false; } }; class OperateOut:public Operation { public: OperateOut(int ia,int ib): Operation(ia, ib) {} //判斷輸入的i是否在 a和b 之外 bool GetResult(int i) { if(i>a && i<b) return false; return true; } }; //工廠類 class Test{ public: Operation *opt = nullptr; explicit Test(char op) : operate(op){} //通過仿函數,返回實際的對象 Operation* operator() (int a,int b){ switch(operate) { case 'i': opt = new OperateIn(a,b); break; case 'o': opt = new OperateOut(a,b); break; } return opt; } private: const char operate; }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); Test t('i'); Operation *pt = t(1,5); qDebug()<<pt->GetResult(3)<<endl; qDebug()<<pt->GetResult(7)<<endl; pt = t(1,8); qDebug()<<pt->GetResult(3)<<endl; qDebug()<<pt->GetResult(7)<<endl; Test t2('o'); pt = t2(1,5); qDebug()<<pt->GetResult(3)<<endl; qDebug()<<pt->GetResult(7)<<endl; return a.exec(); }
可以看到,通過類定義,傳遞“i”和“o”兩種操作方法,()將作用范圍傳遞進去
