std::function

 

定义

C++11引入通用多态函数包装器std::function, 能实现类似函数指针功能, 可以存储、复制和调用任何可调用对象, 如函数、函数指针、lambda表达式、仿函数等

#include <iostream>
#include <functional>
std::function<返回类型(参数...)>
  • 示例, 接受两个 int 参数并返回 void 类型function
std::function<void(int, int)> Func;

操作

绑定普通函数

#include <iostream>
#include <functional>

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

int main() {
    std::function<int(int, int)> Func = Add; 
    std::cout << "Add(2, 3) = " << Func(2, 3) << std::endl;
    return 0;
}

绑定Lambda表达式

#include <iostream>
#include <functional>

int main() {
    std::function<int(int, int)> Multiply = [](int a, int b) { return a * b; };
    std::cout << "Multiply(2, 3) = " << Multiply(2, 3) << std::endl;
    return 0;
}

绑定成员函数

当需要绑定类成员函数时, 可使用 std::bind 或 std::function, 同时需传递类对象实例

std::bind 用于将类成员函数与特定实例绑定, std::placeholders::_1 和 std::placeholders::_2 表示函数参数占位符

#include <iostream>
#include <functional>

class Calculator {
public:
    int Subtract(int a, int b) const {
        return a - b;
    }
};

int main() {
    Calculator calc;
    std::function<int(int, int)> Func = std::bind(&Calculator::Subtract, calc, std::placeholders::_1, std::placeholders::_2);
    std::cout << "Subtract(5, 2) = " << Func(5, 2) << std::endl;
    return 0;
}

使用仿函数(函数对象)

#include <iostream>
#include <functional>
struct Divide {
    int operator()(int a, int b) const {
        return a / b;
    }
};

int main() {
    Divide divide;
    std::function<int(int, int)> Func = divide;
    std::cout << "Divide(6, 2) = " << Func(6, 2) << std::endl;
    return 0;
}

作为回调函数

用于回调函数, 可动态地改变回调行为

#include <iostream>
#include <functional>

void Process(const std::function<void(int)>& CallBack) {
    for (int i = 0; i < 5; ++i) {
        CallBack(i);
    }
}

int main() {
    Process([](int value) {
        std::cout << "Processing value: " << value << std::endl;
    });
    return 0;
}

std::function 可存储所有符合指定函数签名的可调用对象, 但存储对象类型必须与 std::function 签名相同

当 std::function 不指向任何可调用对象时, 其值为 nullptr, 可以使用 if 判断其有效性