C++可调用对象有哪些

it2023-10-21  63

c++ primer可调用对象

如果一个对象可以使用调用运算符(())来调用一个函数,()里面可以放参数,这个对象就是可调用对象。 可调用对象也有类型,例如每个lambda都有他自己唯一(未命名的类型) 我们可以像算法传递任何类别的可调用对象,可调用对象分为以下几种: 1. 函数和函数指针 2. 重载了函数调用运算符的类 3. lambda表达式 4. bind的对象 5. 利用function生成 6. mem_fn生成

不同类型的对象可能有相同的调用形式

函数和函数指针

template<class T> struct printarray { void operator()(const T& t)const { cout << t << endl; } }; void test04() { int ia[] = { 23, 96, 4, 5 }; qsort(ia, sizeof(ia) / sizeof(int), sizeof(int), fun); for_each(ia, ia + sizeof(ia) / sizeof(int), printarray<int>()); }

函数指针的缺点:无法持有自己的状态,也无法达到组件技术中心的可适配性(无法二次修饰,改变状态)

重载Operator()的类对象

class TestA { public: TestA() {}; ~TestA() {}; int operator()(int a, int b) { return a + b; }; private: }; void test01() { TestA a; int i = a(5, 7); }

STL算法接收的仿函数的就是该方法。要成为可配接的仿函数还需要做更多的事情。这部分在仿函数到底是什么一节中叙述

function生成

function<bool(const string &)> fcn = &string::empty; vector<int> vecT = { 1,2, 3 }; find_if(vecT.begin(), vecT.end(), fcn);

mem_fn生成

function必须要提供成员的调用形式,可以使用mem_fn让编译器自动生成

vector<int> vecT = { 1,2, 3 }; find_if(vecT.begin(), vecT.end(), mem_fn(&string::empty));

使用bind生成

auto f = find_if(vec.begin(), vec.end(), bind(&string::empty, _1));
最新回复(0)