21xrx.com
2024-12-23 01:38:59 Monday
登录
文章检索 我的文章 写文章
C++11标准库中的std::function函数对象
2023-06-30 01:44:08 深夜i     --     --
C++11标准库 std::function函数对象 函数指针 多态性 仿函数(function objects)

C++11标准库中的std::function函数对象是一种通用的可调用对象封装器。它可以包装任意的可调用对象,包括函数指针、函数对象、成员函数指针等等,并提供一套统一的调用方法。同时,它还可以通过模板参数来定义调用时返回值和形参类型,从而实现类型安全的调用。

std::function的定义非常简单,它只需要一个模板参数,即可调用对象的签名。例如,我们可以这样定义一个返回int类型,接受两个参数分别为int和double类型的函数对象:

std::function f;

然后,我们可以把任意符合这个签名的可调用对象,赋值给f:

int add(int x, double y) { return x + y; }

struct Foo {

  int operator()(int x, double y) { return x * y; }

};

f = add;

f = Foo();

接下来,我们就可以像调用普通的函数一样,通过std::function对象f来调用它包装的可调用对象:

int result1 = f(1, 2.0); // result1 = 3

int result2 = f(2, 3.0); // result2 = 6

当我们需要使用不同的可调用对象来实现同样的功能时,std::function就非常有用了。例如,我们可以根据输入参数的不同,选择不同的排序算法:

void sort(std::vector & v, std::function comparator) {

  std::sort(v.begin(), v.end(), comparator);

}

bool less(int x, int y) { return x < y; }

bool greater(int x, int y) { return x > y; }

std::vector v = {3, 1, 4};

sort(v, less); // v = {1, 3, 4}

sort(v, greater); // v = {4, 3, 1}

此外,std::function还可以和lambda表达式一起使用,从而实现更加灵活的编程。例如,我们可以使用lambda表达式来定义线程函数,然后把它包装到std::function中,传递给std::thread的构造函数:

std::function thread_func = [](int n) {

  for (int i = 0; i < n; i++) {

    std::cout << "Hello from thread!" << std::endl;

  }

};

std::thread t(thread_func, 5);

总之,std::function是C++11标准库中非常有用的一种功能,它提供了一种统一的接口来封装可调用对象,从而实现更加灵活、通用的编程。合理使用std::function,可以大大提高代码的可读性和可扩展性。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复
    相似文章