学习 c++11 之 function 模板

作者: | 更新日期:

快来学习c++新功能 function 模板 吧。

本文首发于公众号:天空的代码世界,微信号:tiankonguse

零、背景

之前提到,我们开始从 c98 切换到 c++11 了。

所以我打算分一个系列来介绍常见的 c++11 的语法。

今天要分享的第三个知识点大家用的比较少,就是 function 模板 。

一、旧的方式

在一些工厂模式里面会经常遇到一些场景。

比如根据指定的参数调用对应的函数来创建对象或者执行一些操作。

一种不错的方法是记录参数与回调函数指针的对应关系。

函数指针默认的写法非常复杂,没人会玩。
于是大家都是使用 typedef 来对函数指针重命名。

但是由于函数指针的的特殊性,这样写依旧很复杂。
尤其是在写typedef的类型名称时,总是有人不知道写在哪里。

所以我们需要一种符合常规语法的方法,那就是模板函数类。

二、新的方式

新的方式里,我们可以轻松定义一个函数类型。
语法如下:

std::function<返回类型(参数列表)> 函数名称  

这样,我们就不需要纠结怎么函数指针了。

function 函数对象可以直接储存全局函数、匿名函数、仿函数、类的静态函数。


int globalFun(int v){
    return 10 * v;
}

auto lambdaFun = [](int v)->int{
    return 20 * v;
};

class Functor{
public:
    int operator()(int v){
        return 30 * v;
    }
};


class Class{
public:
    static int classFun(int v){
        return 40 * v;
    }
};

void test(){
    std::function< int(int)> func;
    func = globalFun;
    cout << "globalFun: " << func(100) << endl;
    func = lambdaFun;
    cout << "lambdaFun: " << func(100) << endl;
    func = Functor();
    cout << "Functor: " << func(100) << endl;
    func = Class::classFun;
    cout << "Class::classFun: " << func(100) << endl;
}

而对于类的普通函数,则需要使用更高级的做法才能储存起来,以后有机会分享给大家。

三、实际应用

上一篇文章《学习 c++11 之 Lambda表达式》里介绍了匿名函数。

那匿名函数创建后,总需要储存起来吧。

你猜的没错,就是定义一个 function 变量来储存。

这样就可以在恰当的时机,回调业务写的一段代码块,俗称匿名函数。

四、最后

函数类这个语法是一件非常有意义的突破。

有了函数类,所有的函数都是一家人了。

我们通过同一个方式储存与访问所有的函数。

你们在哪些场景使用函数类呢?

-EOF-

本文公众号:天空的代码世界
个人微信号:tiankonguse
公众号ID:tiankonguse-code

本文首发于公众号:天空的代码世界,微信号:tiankonguse
如果你想留言,可以在微信里面关注公众号进行留言。

关注公众号,接收最新消息

tiankonguse +
穿越