[c++] Callable Objects

Five kinds of callable objects:

  1. Functions
  2. Pointers to functions
  3. Objects of a class that overloads ()
  4. Objects created by bind
  5. Objects created by lamdba expressions


1-2. Functions and Pointers to functions

    bool range5to10(int val)  // <-- bool (*p_func)(int) 改为函数指针是一个道理    {      return (5 <= val && val <= 10);    }

    vector<int> vec{ 20, 2, 4, 3, 8, 10, 15, 1};

    auto presult = find_if(vec.begin(), vec.end(), range5to10);

    if (presult == vec.end())
    {
        cout << "no" << endl;
    }
    else
    {
        cout << "yes" << endl;
    }

更高逼格的template,至少能在类型上更加灵活一些。

template <class T, T lb, T ub>
struct range {
    bool operator() (T val) {
        return (lb <=val && val <=ub);
    }
};

auto presult = find_if(vec.begin(), vec.end(), range<int, 5, 10>{});

3. Object of class

class range {
public:
    range(int l, int u): lb(l), ub(u) {  // <-- 这里的构建函数的使用体现了其优势:初始化能多做些事情
    }

    bool operator() (int val) {
        return (lb <=val && val <=ub);
    }

private:
    int lb, ub;
};

auto presult = find_if(vec.begin(), vec.end(), range{5, 10});

思考:对比模板与类两种方式,可见高大上的模板并非浪得虚名。

void f(int a, int b, int c)
{
    cout << a << " " << b << " " << c << endl;
}

auto g1 = bind(f, placeholders::_1, placeholders::_2, 100);
g1(1, 2); 


4. Bind

// 类的构建函数的初始化参数的一种类似的方式class range {
public:
    bool operator() (int lb, int ub, int val) {
        return (lb <=val && val <=ub);
    }
};

auto presult = find_if(vec.begin(), vec.end(),                        bind(range{}, 5, 10, placeholders::_1));   //placeholders::_1 here可能代表val,暂不懂

When bind1st, 10绑定了greater()的第一个参数。

When bind2st, 10绑定了greater()的第二个参数。

template <class T> struct greater {
  bool operator() (const T& x, const T& y) const {return x>y;}
  typedef T first_argument_type;
  typedef T second_argument_type;
  typedef bool result_type;
};

Result: c1 = 5, c2 = 2;

#include<functional

一眼望去,就是模板函数的样子。

not1(op)

not2(op)

两个要屌炸天的函数,详见链接。



5. Lambda Functions

<functional>的本质是什么?如下:

“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。

Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。

例子:(有点inline的意思)

由于Lambda的类型是唯一的,不能通过类型名来显式声明对应的对象,但可以利用auto关键字和类型推导:

auto f=[](int a,int b){return a>b;};
** 捕获 **auto f = [x](int a,int b){return a>x;});//x被捕获复制
int x=0,y=1;
auto g = [&](int x){return ++y;});//y被捕获引用,调用g后会修改y,需要注意y的生存期 (y是返回值)

** 未捕获 **
bool(*fp)(int,int) = [](int a,int b){return a>b;});//不捕获时才可转换为“函数指针”
时间: 2024-12-22 18:24:28

[c++] Callable Objects的相关文章

Python著名的lib和开发框架(均为转载)

第一,https://github.com/vinta/awesome-python Awesome Python A curated list of awesome Python frameworks, libraries, software and resources. Inspired by awesome-php. Awesome Python Admin Panels Algorithms and Design Patterns Anti-spam Asset Management A

C++11 Lambda表达式简单解析

C++11 新增了很多特性,lambda 表达式是其中之一,如果你想了解的 C++11 完整特性, 建议去http://www.open-std.org/看看新标准! 很多语言都提供了 lambda 表达式,如 Python,Java 8 lambda 表达式可以方便地构造匿名函数,如果你的代码里面存在大量的小函数,而这些函数一般只被调用一次,那么不妨将他们重构成 lambda 表达式. C++11 的 lambda 表达式规范如下: [ capture ] ( params ) mutable

使用Java7提供的Fork/Join框架

在Java7中,JDK提供对多线程开发提供了一个非常强大的框架,就是Fork/Join框架.这个是对原来的Executors更 进一步,在原来的基础上增加了并行分治计算中的一种Work-stealing策略,就是指的是.当一个线程正在等待他创建的 子线程运行的时候,当前线程如果完成了自己的任务后,就会寻找还没有被运行的任务并且运行他们,这样就是和 Executors这个方式最大的区别,更加有效的使用了线程的资源和功能.所以非常推荐使用Fork/Join框架. 下面我们以一个例子来说明这个框架如何

在 tornado 中异步无阻塞的执行耗时任务

在 linux 上 tornado 是基于 epoll 的事件驱动框架,在网络事件上是无阻塞的.但是因为 tornado 自身是单线程的,所以如果我们在某一个时刻执行了一个耗时的任务,那么就会阻塞在这里,无法响应其他的任务请求,这个和 tornado 的高性能服务器称号不符,所以我们要想办法把耗时的任务转换为不阻塞主线程,让耗时的任务不影响对其他请求的响应. 在 python 3.2 上,增加了一个并行库 concurrent.futures,这个库提供了更简单的异步执行函数的方法. 如果是在

C++11 lambda 表达式解析

C++11 新增了很多特性,lambda 表达式是其中之一,如果你想了解的 C++11 完整特性,建议去这里,这里,这里,还有这里看看.本文作为 5 月的最后一篇博客,将介绍 C++11 的 lambda 表达式. 很多语言都提供了 lambda 表达式,如 Python,Java 8.lambda 表达式可以方便地构造匿名函数,如果你的代码里面存在大量的小函数,而这些函数一般只被调用一次,那么不妨将他们重构成 lambda 表达式. C++11 的 lambda 表达式规范如下: [ capt

Java Concurrency - Fork/Join Framework

Normally, when you implement a simple, concurrent Java application, you implement some Runnable objects and then the corresponding Thread objects. You control the creation, execution, and status of those threads in your program. Java 5 introduced an

【足迹C++primer】48、函数引用操作符

函数引用操作符 struct absInt { int operator()(int val) const { cout<<val<<"<->!!!"<<endl; return val<0 ? -val : val; } }; void fun1() { int i=-42; absInt absObj; int ui=absObj(i); } Function-Object Classes with State 函数对象类的状态

Tornado异步阻塞解决方案

在 tornado 中异步无阻塞的执行耗时任务 在 linux 上 tornado 是基于 epoll 的事件驱动框架,在网络事件上是无阻塞的.但是因为 tornado 自身是单线程的,所以如果我们在某一个时刻执行了一个耗时的任务,那么就会阻塞在这里,无法响应其他的任务请求,这个和 tornado 的高性能服务器称号不符,所以我们要想办法把耗时的任务转换为不阻塞主线程,让耗时的任务不影响对其他请求的响应. 在 python 3.2 上,增加了一个并行库 concurrent.futures,这个

python嵌入到C++的一些理解

1.简介(比较各自的特点,提出问题) C++ 与 python都是用的比较广泛的语言,各有各的优点:C++性能优异,python简单方便库丰富,如果能够结合两者使用就很好. python作为一种脚本语言,解释器会将其翻译成可执行代码.python强大呀,提供了C接口供C/C++调用,意思就是C/C++就能嵌入python代码,实际中就能够发挥两种语言的优点了. 2.如何实现 在实现上,Python提供了C接口供C/C++使用,以C语言lib库的形式提供include和lib:可以在python的