最近閱讀C++代碼時看到這樣的代碼,沒太理解,于是百度了解了一下,特此記錄備忘。
class ClassAction
{
public:
void operator()(){
......
}
private:
int dataValue;
}
參考
- https://blog.csdn.net/jinzhu1911/article/details/101317367
- https://blog.csdn.net/xgf415/article/details/52966475?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control
c++類可以重載()【即小括號符】,來實現仿函數,或者叫函數對象。那么這個類可以行使函數的功能,用以優雅的實現一些功能。
基本使用方式
class FuncClass
{
public:
void operator()(const string& str) const
{
std::cout << str << std::endl;
}
};
int main()
{
FuncClass myFuncClass;
myFuncClass("hello world");
}
與普通函數相比,函數對象(仿函數)比普通函數更加靈活,函數對象的優勢:
- 函數對象可以有自己的狀態。我們可以在類中定義狀態變量,這樣一個函數對象在多次的調用中可以共享這個狀態;
- 函數對象有自己特有的類型。我們可以傳遞相應的類型作為參數來實例化相應的模板,比如說帶參數的函數形參。
例子
- 當callback函數使用,用以通用操作
class ShorterThan
{
public:
explicit ShorterThan(int maxLength):length(maxLength)
{}
bool operator() (const string& str) const
{
return str.length() < length;
}
private:
const int length;
};
int main()
{
vector<string> myVec;
myVec.push_back("Jack");
myVec.push_back("Llihass");
myVec.push_back("tTT");
int result = count_if(myVec.begin(), myVec.end(), ShorterThan(4));
cout << "count: " << result << endl;
}
- 謂詞函數
謂詞函數通常用來對傳進來的參數進行判斷,并返回布爾值。但是一般的函數形式固化,比如字符串長度比較只能判斷是否大于一個確定的長度值。函數對象可以作為謂詞函數,并可以在類初始化時傳遞參數,如字符串長度參考值,因此函數對象比普通函數更加靈活。
class Upper
{
public:
Upper(int min = 0):m_min(min)
{}
bool operator() (int value) const
{
return value >= m_min;
}
private:
int m_min;
};
int main()
{
vector<int> intVec;
intVec.push_back(10);
intVec.push_back(6);
intVec.push_back(12);
vector<int>::iterator targetIterator = find_if(intVec.begin(), intVec.end(), Upper(10));
if (targetIterator != intVec.end())
{
cout << "value: " << *targetIterator << endl;
}
}
首先生成類 Upper 的對象,并用 10 初始化,調用find_if 時將用該函數對象進行判斷。
請注意:在調用用到函數對象的標準庫算法時,除非顯式地指定模板類型為傳引用,否則默認情況下函數對象是按值傳遞的!因此,如果傳遞一個具有內部狀態的函數對象,則被改變狀態的是函數內部被復制的臨時對象,函數結束后隨之消失。真正傳進來的函數對象狀態并為改變。