c++ auto与function用法

Posted bitcarmanlee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ auto与function用法相关的知识,希望对你有一定的参考价值。

1.auto关键字的用法

auto是c++中的关键字,主要用法有两条,第一条就是根据初始化表达式自动推断该变量的类型。

void f2() 
    auto a = 1;
    auto b = 1.0;
    auto c = "abc";
    cout<<typeid(a).name()<<endl;
    cout<<typeid(b).name()<<endl;
    cout<<typeid(c).name()<<endl;

上面代码的输出如下

i
d
PKc

上面的代码可以正常运行没有问题,但是我们一般不这么作,因为上面的这些变量都是比较简单的类型,完全可以直接写出真正的类型。
再看下面的例子。

void f1() 
    map<int, string> mymap;
    mymap[1] = "a";
    mymap.insert(make_pair(3, "c"));
    mymap.insert(map<int, string>::value_type(2, "b"));
    mymap[4] = "d";
    map<int, string>::iterator iter;
    for(iter=mymap.begin(); iter!=mymap.end(); iter++) 
        cout<<iter->first<<": "<<iter->second<<endl;
    
    cout<<endl;
    for(auto iter: mymap) 
        cout<<iter.first<<": "<<iter.second<<endl;
    

1: a
2: b
3: c
4: d

1: a
2: b
3: c
4: d

auto真正比较常见的用处是上面这种场景。iter的类型比较复杂冗长,而且就会在遍历map的时候使用,我们直接用auto声明会使程序更加简洁明了,效果也完全一致。

2.auto声明函数时函数返回值的占位符

auto还可以保存函数表达式类型的变量声明。

void f2() 
    auto p = [](int x) return x*x;;
    int result = p(2);
    cout<<"result is: "<<result<<endl;
    std::function<int(int)> f2 = [](int x) return x*x;;
    int f2result = f2(2);
    cout<<"f2result is: "<<f2result<<endl;


int main(int argc, char const *argv[])

    f2();
    return 0;

上面代码返回结果

result is: 4
f2result is: 4

从上面两点不难看出, auto最大的好处在于,当初始化表达式为复杂类型变量声明时,auto能使代码更加简洁。

3.function用法

std::function的实例可以对任何可以调用的目标对象进行存储、复制和调用操作,而函数指针只能指向一种类型的函数,并且函数指针也是类型不安全的。

可调用对象(callable object)包括以下类型:
1.函数
2.函数指针
3.lambda表达式
4.函数对象,仿函数
5.bind创建的对象

对于std::function最简单明了的理解是:function实现了函数的存储,即先将可调用实体保存起来,在需要的时候再调用。

#include<iostream>
#include<functional>
using namespace std;

int testfunc(int a, int b) 
    return a+b;


auto exps = [](int a, int b) return a+b;;

class MyFunctor 
    public:
        int operator()(int a, int b) 
            return a+b;
        
;

class MyClass 
    public:
        int memberFun(int a, int b) return a+b;
        static int staticMemberFun(int a, int b) return a+b;
;

void f1() 
    function<int(int, int)> func = testfunc;
    int result = func(1, 2);
    cout<<"result is: "<<result<<endl;

    func = &testfunc;
    int result2 = func(2, 3);
    cout<<"result2 is: "<<result2<<endl;

    func = exps;
    int result3 = func(4, 5);
    cout<<"result3 is: "<<result3<<endl;

    MyFunctor functor;
    func = functor;
    int result4 = func(6, 7);
    cout<<"result4 is: "<<result4<<endl;

    MyClass objclass;
    func = bind(&MyClass::memberFun, objclass, std::placeholders::_1, std::placeholders::_2);
    int result5 = func(8, 9);
    cout<<"result5 is: "<<result5<<endl;

    func = MyClass::staticMemberFun;
    int result6 = func(10, 11);
    cout<<"result6 is: "<<result6<<endl;
;

int main(int argc, char const *argv[])

    f1();
    return 0;

result is: 3
result2 is: 5
result3 is: 9
result4 is: 13
result5 is: 17
result6 is: 21

以上是关于c++ auto与function用法的主要内容,如果未能解决你的问题,请参考以下文章

现代C++之理解auto类型推断

C++之auto关键字

auto用法

C++ 一维数组及二维数组的特征和用法

小白学习C++ 教程二十C++ 中的auto关键字

C++ 优先队列 堆 priority_queue的使用 以及内部使用结构化pair的排序的用法 auto在其中的用法(结构化绑定 C++17以上)