C++可调用对象详解

文章目录一、函数二、函数指针三、重载了函数调用运算符的类四、Lambda表达式(C++11)1.参数2.捕获列表2.1值捕获2.2引用捕获2.3隐式捕获2.4混合捕获3.返回值类型4.深度理解4.1 Lambda是函数对象4.1 表示Lambda捕获行为的类5.应用场景对于一个对象或者表达式,如果可以对其使用调用运算符,即。如果a是一个可调用的表达式,则我们可以编写 a(args) ,其中 a...
摘要由CSDN通过智能技术生成

我认为深刻理解 Lambda 表达式最好的方法就是结合具体的场景多用,个人强烈建议对照这篇文章来理解本文的知识:可调用对象的应用场景

对于一个对象或者表达式,如果可以对其使用调用运算符,即。如果a是一个可调用的表达式,则我们可以编写 a(args) ,其中 args 是一个逗号分割的一个或多个参数的列表。

一、函数

//定义函数 add_func
int add_func(int a, int b){
   
    int c = a + b;
    return c;
}

//调用函数 add_func
int sum = add_func(3, 5);

二、函数指针

通常我们可以定义一个指向函数的指针,通过这个指针调用特定类型的函数。

demo:

#include <iostream>

int add(int a, int b){
   
    return a + b;
}

int sub(int a, int b){
   
    return a - b;
}

using pfunc = int(*)(int, int); //定义一个函数指针pfunc

int middle_func(pfunc p, int a, int b){
   
    int result = p(a, b); //通过函数指针类型对象调用函数
    return result;
}

int main(){
   
    int a = 2;
    int b = 3;
    int sum = middle_func(add, a, b); //传入函数 add 给函数指针类型形参
    std::cout << a << " + " << b << " = " << sum << std::endl;
}

三、重载了函数调用运算符的类

如果类重载了函数调用运算符,则我们可以像使用函数一样使用该类的对象。因为这样的类同时也能存储状态,所以与普通函数相比更加灵活。(函数对象常常用作泛型算法的谓词)

demo:

//不包含状态的函数对象类
struct SortCmp{
   
    int operator()(const std::string& s1, const std::string& s2){
   
        return s1.size() < s2.size();
    }  
};

std::vector<std::string> words{
   "aaa", "aa", "aaaa", "a"};
//对words进行排序,注意传递谓词时要带上调用符,下面是一个错误示范
//std::sort(words.begin(), words.end(), SortCmp); //error
std::sort(words.begin(), words.end(), SortCmp());

demo:

//包含状态的函数对象类

struct Doc{
   
    int id;
    std::string doc
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值