C++ 新特性 | C++ 11 | function

一、function

1、概念

std::function 是 C++11 引入的一个通用的函数包装器,它可以存储、复制和调用任何可调用对象,包括:

  • 普通函数
  • 成员函数
  • 函数对象(重载了 operator() 的类)
  • lambda 表达式
  • 其他函数指针

注意:包装器类型仅仅依赖于调用特征,而不依赖于可调用元素自身的类型。调用特征标是由函数返回值类型及参数列表共同构成。

2、使用场景

2.1、回调机制

在事件驱动或异步编程中作为回调函数

   std::function<void(int)> callback;
   void register_callback(std::function<void(int)> cb) {
       callback = cb;
   }

2.2、策略模式

在运行时选择不同的算法或行为

   std::function<bool(int, int)> compare;
   compare = std::less<int>();  // 使用小于比较
   compare = std::greater<int>(); // 切换为大于比较

2.3、存储不同类型的可调用对象

std::vector<std::function<void()>> tasks;
tasks.push_back([](){ std::cout << "Task 1\n"; });
tasks.push_back(std::bind(&SomeClass::method, &obj));

std::function 提供了灵活的函数封装能力,是现代 C++ 中实现回调、事件处理和策略模式的重要工具。

3、示例代码

#include <iostream>
#include <functional>

void print_num(int i) {
    std::cout << "Number: " << i << '\n';
}

struct Print {
    void operator()(int i) const {
        std::cout << "Print object: " << i << '\n';
    }
};

int main() {
    // 存储普通函数
    std::function<void(int)> f1 = print_num;
    f1(42);
    
    // 存储lambda表达式
    std::function<void(int)> f2 = [](int i) {
        std::cout << "Lambda: " << i << '\n';
    };
    f2(43);
    
    // 存储函数对象
    std::function<void(int)> f3 = Print();
    f3(44);
    
    // 绑定成员函数
    struct Foo {
        void print(int i) const { std::cout << "Foo: " << i << '\n'; }
    };
    Foo foo;
    std::function<void(int)> f4 = std::bind(&Foo::print, &foo, std::placeholders::_1);
    f4(45);
    
    // 检查是否有可调用对象
    std::function<void(int)> f5;
    if (!f5) {
        std::cout << "f5 is empty\n";
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值