最近阅读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 时将用该函数对象进行判断。
请注意:在调用用到函数对象的标准库算法时,除非显式地指定模板类型为传引用,否则默认情况下函数对象是按值传递的!因此,如果传递一个具有内部状态的函数对象,则被改变状态的是函数内部被复制的临时对象,函数结束后随之消失。真正传进来的函数对象状态并为改变。