一、代码举例
class ClassAction
{
public:
void operator()(){
......
}
private:
int dataValue;
}
二、重载operator()作用
c++类可以重载()【即小括号符】,来实现仿函数,或者叫函数对象。那么这个类可以行使函数的功能,用以优雅的实现一些功能
- 实例举例代码
class FuncClass
{
public:
void operator()(const string& str) const
{
std::cout << str << std::endl;
}
};
int main()
{
FuncClass myFuncClass;
myFuncClass("hello world");
}
三、优势
与普通函数相比,函数对象(仿函数)比普通函数更加灵活,函数对象的优势:
1)函数对象可以有自己的状态。我们可以在类中定义状态变量,这样一个函数对象在多次的调用中可以共享这个状态;
2)函数对象有自己特有的类型。我们可以传递相应的类型作为参数来实例化相应的模板,比如说带参数的函数形参。
四、使用举例
1)当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;
}
2)谓词函数
谓词函数通常用来对传进来的参数进行判断,并返回布尔值。但是一般的函数形式固化,比如字符串长度比较只能判断是否大于一个确定的长度值。函数对象可以作为谓词函数,并可以在类初始化时传递参数,如字符串长度参考值,因此函数对象比普通函数更加灵活。
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 时将用该函数对象进行判断。
五、注意事项
在调用用到函数对象的标准库算法时,除非显式地指定模板类型为传引用,否则默认情况下函数对象是按值传递的!
本文详细介绍了C++中如何通过重载`operator()`实现函数对象,也称为仿函数。函数对象可以拥有自己的状态并提供更灵活的函数行为,例如在回调函数和谓词函数中的应用。文章通过实例展示了如何创建和使用函数对象,并强调了其相比普通函数的灵活性,特别是在共享状态和模板参数方面的优势。同时,文中还提到了使用函数对象时应注意的事项,如在标准库算法中可能发生的按值传递问题。
8854

被折叠的 条评论
为什么被折叠?



