其他分享
首页 > 其他分享> > 什么是C仿函数及其用途?

什么是C仿函数及其用途?

作者:互联网

我一直听到很多关于C语言的仿函数.有人可以给我一个关于它们是什么的概述以及在什么情况下它们会有用吗?

解决方法:

仿函数几乎只是一个定义operator()的类.这使您可以创建“看起来像”一个函数的对象:

// this is a functor
struct add_x {
  add_x(int x) : x(x) {}
  int operator()(int y) const { return x + y; }

private:
  int x;
};

// Now you can use it like this:
add_x add42(42); // create an instance of the functor class
int i = add42(8); // and "call" it
assert(i == 50); // and it added 42 to its argument

std::vector<int> in; // assume this contains a bunch of values)
std::vector<int> out(in.size());
// Pass a functor to std::transform, which calls the functor on every element 
// in the input sequence, and stores the result to the output sequence
std::transform(in.begin(), in.end(), out.begin(), add_x(1)); 
assert(out[i] == in[i] + 1); // for all i

有两个关于仿函数的好东西.一个是与常规函数不同,它们可以包含状态.上面的示例创建了一个函数,它可以为您提供的任何内容添加42.但是该值42不是硬编码的,它在我们创建函数实例时被指定为构造函数参数.我可以通过使用不同的值调用构造函数来创建另一个添加了27的加法器.这使得它们可以很好地定制.

如最后一行所示,您经常将函子作为参数传递给其他函数,例如std :: transform或其他标准库算法.您可以使用常规函数指针执行相同操作,除了如上所述,仿函数可以“自定义”,因为它们包含状态,使它们更灵活(如果我想使用函数指针,我必须编写函数它在参数中添加了1个.函子是通用的,并添加了用它初始化的任何内容,并且它们也可能更有效.在上面的例子中,编译器确切地知道std :: transform应该调用哪个函数.它应该调用add_x :: operator().这意味着它可以内联该函数调用.这使得它就像我在向量的每个值上手动调用函数一样高效.

如果我传递了一个函数指针,编译器就无法立即看到它指向哪个函数,所以除非它执行一些相当复杂的全局优化,否则它必须在运行时取消引用指针,然后进行调用.

标签:function-object,c,functor,function-call-operator
来源: https://codeday.me/bug/20190910/1802380.html