c++可调用对象callable object

对于一个对象或表达式,如果可以对其使用运算符,则称它为可调用的。

包含如下:

普通函数

int int_add(const int a, const int b) {
    return a + b;
}

函数指针

// 定义一个接受两个int参数 返回int的函数指针
typedef int(*compute)(int, int);

int min(int x, int y) { return x <= y ? x : y; }
int max(int x, int y) { return x >= y ? x : y; }

int compute_x_y(int x, int y, compute fc) { return fc(x, y); }

int main(void) {
    int x =3, int y = 5;

    std::cout << "min:" << compute_x_y(x, y, min) << std::endl; // 3
    std::cout << "max:“ << compute_x_y(x, y, max) << std::endl; // 5

    // 无捕获的lambda表达式可以转换为相同类型的函数指针
    auto sum = [](int x, int y) { return x+y; }
    std::cout << "sum:" << compute_x_y(x, y, sum) << std::endl; // 8
}

return 0;

类成员函数、类静态函数、防函数

class some {
public:
   // 仿函数
   int operator()(int a, int b) {
      return a + b;
   }

   // 类成员函数
   int add_a(int a, int b) {
       return a + b;
   }    

   // 类静态函数
   static int add_b(int a, int b) {
       return a + b;
   }
}

lambda表达式

auto add = [](int a, int b)->int { return a + b; }

std::funtion

#include  <functional>

std::function<int(int, int)> Add()

其他函数实体转换为std::function

std::functiion 兼容所有具有相同参数类型的函数实体, 包括带捕获的lamda表达式,类的成员函数等。

#include <iostream>
#include <functional>

// std::function
std::function<int(int, int)> SumFunction;

// 普通函数
int func_sum(int a, int b)
{
    return a + b;
}

class Calcu
{
public:
    int base = 20;
    // 类的成员方法,参数包含this指针
    int class_func_sum(const int a, const int b) const { return this->base + a + b; };
    // 类的静态成员方法,不包含this指针
    static int class_static_func_sum(const int a, const int b) { return a + b; };
};

// 仿函数
class ImitateAdd
{
public:
    int operator()(const int a, const int b) const { return a + b; };
};

// lambda函数
auto lambda_func_sum = [](int a, int b) -> int { return a + b; };

// 函数指针
int (*func_pointer)(int, int);

int main(void) 
{
    int x = 2; 
    int y = 5;

    // 普通函数
    SumFunction = func_sum;
    int sum = SumFunction(x, y);
    std::cout << "func_sum:" << sum << std::endl;

    // 类成员函数
    Calcu obj;
    SumFunction = std::bind(&Calcu::class_func_sum, obj, 
        std::placeholders::_1, std::placeholders::_2); // 绑定this对象
    sum = SumFunction(x, y);
    std::cout << "Calcu::class_func_sum:" << sum << std::endl;

    // 类静态函数
    SumFunction = Calcu::class_static_func_sum;
    sum = SumFunction(x, y);
    std::cout << "Calcu::class_static_func_sum:" << sum << std::endl;

    // lambda函数
    SumFunction = lambda_func_sum;
    sum = SumFunction(x, y);
    std::cout << "lambda_func_sum:" << sum << std::endl;

    // 带捕获的lambda函数
    int base = 10;
    auto lambda_func_with_capture_sum = [&base](int x, int y)->int { return x + y + base; };
    SumFunction = lambda_func_with_capture_sum;
    sum = SumFunction(x, y);
    std::cout << "lambda_func_with_capture_sum:" << sum << std::endl;

    // 仿函数
    ImitateAdd imitate;
    SumFunction = imitate;
    sum = SumFunction(x, y);
    std::cout << "imitate func:" << sum << std::endl;

    // 函数指针
    func_pointer = func_sum;
    SumFunction = func_pointer;
    sum = SumFunction(x, y);
    std::cout << "function pointer:" << sum << std::endl;

    getchar();
    return 0;
}

std::bind通用的函数适配器

见上面的代码

发表回复

您的电子邮箱地址不会被公开。