简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:理解C++之std::function和lambda表达式回调函数与函数指针的区别,类型不同。
注意:应用实例的v1.0和v2.0区别。
2.应用实例
v1.0
#include <iostream>
#include <functional>
#include <string>
using namespace std;//using和typdef都是起别名: 将函数类型起一个新的别名,作用一样;将别名类型interfaceDescriptor_cb作为参数传入interfaceDescriptor函数.//v1.0: using定义函数指针的别名
using interfaceDescriptor_cb = std::function<void(const string& descriptor)>;//引用传递
//using interfaceDescriptor_cb = std::function<void(string descriptor)>;//值传递//v2.0: typedef定义函数指针的别名
//typedef std::function<void(const string& descriptor)> interfaceDescriptor_cb;void interfaceDescriptor(interfaceDescriptor_cb _hidl_cb){_hidl_cb(string("android.frameworks.cameraservice.service@2.2::ICameraService"));
}void test(const std::string& desc){printf("xxx------>%s(), line = %d, desc_name = %s\n",__FUNCTION__,__LINE__, desc.c_str());
}int main() {//v1.0: 使用lambda表示调用, &引用传递 。interfaceDescriptor([](const string& desc) {printf("xxx------>%s(), line = %d, desc_name = %s\n",__FUNCTION__,__LINE__, desc.c_str());});/*lambda表达式:即匿名函数.本质是:让函数指针interfaceDescriptor_cb指向([](const string& desc) { printf("desc_name = %s\n", desc.c_str());})lambda表达式的匿名函数.本质还是一个函数指针指向一个匿名函数而已.*///v2.0:直接使用传递,而不用lambda表达式.interfaceDescriptor(test);//v3.0: 值传递// interfaceDescriptor([](string descriptor) {// printf("desc_name = %s\n", desc.c_str());// });return 0;
}
v2.0
#include <iostream>
#include <functional>
#include <string>void interfaceDescriptor(std::function<void(const std::string& descriptor)> _hidl_cb){_hidl_cb("android.frameworks.cameraservice.service@2.2::ICameraService");
}void test(const std::string& desc){std::cout << "xxx------>" << __FUNCTION__ << "(), line = " << __LINE__ << ", desc_name = " << desc << std::endl;
}int main() {//v1.0interfaceDescriptor(test);//v2.0interfaceDescriptor([](const std::string& desc) {printf("xxx------>%s(), line = %d, desc_name = %s\n",__FUNCTION__,__LINE__, desc.c_str());});return 0;
}