C++ 可调用对象使用范例
对C++中的可调用对象做一个整理,
1.函数
函数、静态函数、成员函数、静态成员函数
2.函数调用运算符
重载类的 ( ) 运算符
3.函数指针
4.lambda 表达式 以表达式的方式写一个匿名函数
5.std::bind
6.std::function 一个可调用模板,能表示任何可调用之物
#include<iostream> #include <functional> using std::function; using namespace std; //普通函数 void dowork() { std::cout << "call dowork" << endl; } bool isGreaterThanOne(int a) { return a > 1; } using funcBoolInt = std::function<bool(int)>; //使用 using 代替 typedef void (*funcPtr)(); //声明一个函数指针 class A { public: A() : isMoreThanOne(nullptr) {};//初始化 bool operator() () //重载函数调用运算符 { dowork(); return true; } public: funcBoolInt isMoreThanOne; static int add(int a, int b) //静态成员函数 { return a + b; } int sum(int a, int b) //成员函数 { return a + b; } }; //为方便,main 不返回值,不带参数 void main() { A objA; objA.isMoreThanOne = isGreaterThanOne; bool bFlag = objA.isMoreThanOne(10);//1.调用 std::function objA(); //2.调用 函数调用运算符 cout << endl; int cc = A::add(1, 2); //3.调用静态成员函数 //4.使用 std::bind using namespace std::placeholders; // 函数参数 占位符 for _1, _2, _3... auto funcSum = std::bind(&A::sum, &objA, 10, _1); //这里先传了一个参数 //auto funcSum2 = std::bind(&A::sum, &objA, _1, _2); //一个都不传,用了两个占位符 //cout << funcSum2(11, 12) << endl; auto funDowork = std::bind(dowork); cout<<"call objection std::bind :"<<funcSum(20)<<endl; //std::bind 绑定成员函数 funDowork(); //std::bind 绑定成员函数 cout << endl; //5.函数指针 funcPtr = dowork; funcPtr(); //6.lambda 表达式 cout << endl; auto funcLambda = [objA]() ->int //捕获先前的对象 objA, 不带参数,返回一个 int { int ret = objA.add(11,16); return ret; }; cout << funcLambda() << endl; }
本文来自博客园,作者:狂野先森,转载请注明原文链接:https://www.cnblogs.com/geeon/p/17759625.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)