【函数对象模板类】(function object) function使用方式

1. function用法及其含义

function是C++11中的一个函数对象(function object)模板类,它可以将任意可调用对象(如函数指针、成员函数指针、lambda表达式等)包装为一个可以像函数一样被调用的对象。function模板类定义如下:

template<class R, class... Args>
class function<R(Args...)>

其中</fr ont = red>R表示函数的返回类型,Args…表示函数的参数列表。function模板类的实例化类型由这些模板参数决定。

使用function可以实现类型擦除,即将不同类型的可调用对象都封装为相同的类型,并可以通过相同的接口进行调用。

以下是一个使用function的简单示例:

#include <iostream>
#include <functional>

// 定义一个函数,它将两个整数相加并返回它们的和
int add(int a, int b) {
    
    
    return a + b;
}

// 定义一个Lambda表达式,它将两个整数相乘并返回它们的积
auto multiply = [](int a, int b){
    
    
    return a * b;
};

int main() {
    
    
    // 将add函数和multiply lambda表达式都封装为function对象
    std::function<int(int, int)> func1 = add;
    std::function<int(int, int)> func2 = multiply;

    // 调用function对象,输出结果
    std::cout << "Result1: " << func1(2, 3) << std::endl; // 输出 "Result1: 5"
    std::cout << "Result2: " << func2(2, 3) << std::endl; // 输出 "Result2: 6"

    return 0;
}

在这个示例中,我们首先定义了一个函数add和一个Lambda表达式multiply,它们都接收两个整数作为参数,并返回一个整数结果。然后,我们使用function模板类将它们都封装为std::function<int(int, int)>类型的对象,即可以接受两个整数参数并返回一个整数结果的函数对象。

最后,我们调用这两个function对象,并输出它们的结果。需要注意的是,在调用function对象时,我们可以像调用普通函数一样使用它们,而无需关心它们具体的实现方式。

总之,function的主要用途是将可调用对象进行封装,使得它们可以以统一的形式被调用,从而提高代码的灵活性和复用性。它在STL中的应用非常广泛,例如在算法中作为回调函数使用,或者在GUI编程中作为事件处理函数使用等。

2. typedef std::function<int(int, char**)> command_func_t; 这个结构的用法是什么 举例说明

这个结构定义了一个名为command_func_t的函数指针类型,该函数接受两个参数:一个int类型的整数和一个char**类型的指向字符数组的指针。它返回一个整数值。

在C++中,函数也可以看作一种数据类型,而函数指针则是指向函数的指针变量。在此基础上,我们可以使用typedef关键字对函数指针进行重定义,使其更加简洁易读。

以下是一个示例,演示了如何使用这个结构:

#include <iostream>
#include <functional>

// 定义一个函数,它将两个整数相加并返回它们的和
int add(int a, int b) {
    
    
    return a + b;
}

// 定义一个函数,它将两个整数相乘并返回它们的积
int multiply(int a, int b) {
    
    
    return a * b;
}

// 定义一个命令处理函数类型
typedef std::function<int(int, char**)> command_func_t;

// 定义一个函数,它接收一个命令处理函数作为参数,并执行该函数
void process_command(command_func_t func) {
    
    
    // 执行命令处理函数
    int result = func(2, nullptr);

    // 输出结果
    std::cout << "Result: " << result << std::endl;
}

int main() {
    
    
    // 使用add函数来表示命令处理函数
    command_func_t func = add;

    // 执行命令处理函数
    process_command(func);

    // 使用multiply函数来表示命令处理函数
    func = multiply;

    // 执行命令处理函数
    process_command(func);

    return 0;
}

在这个示例中,我们首先定义了两个简单的函数add和multiply,它们将两个整数相加和相乘,并返回结果。然后,我们定义了一个命令处理函数类型command_func_t,它是一个可以接受两个参数并返回一个整数的函数指针类型。

接下来,我们定义了一个process_command函数,它接收一个命令处理函数作为参数,并执行该函数。在主函数中,我们使用add函数和multiply函数来代表两个不同的命令处理函数,并调用process_command函数来执行它们。最终,程序将输出两个结果,即add函数和multiply函数的结果。

需要注意的是,这只是一个简单的示例,实际应用中,command_func_t可以用于更加复杂和灵活的情况,例如注册回调函数、事件处理等场景。

猜你喜欢

转载自blog.csdn.net/Darlingqiang/article/details/134197193