C++11/14介绍(二)——语言可用性的强化(二)

26 篇文章 0 订阅

类型推导

  • 在传统C/C++中,任何参数的类型都必须明确定义,这会使开发效率变慢,而且让代码变得冗长
  • C++11引入了autodecltype实现了类型推导

一、auto

  • 使用auto进行类型推导的一个最为常见而且显著的例子就是迭代器,以前需要这样写:

    for(vector<int>::const_iterator itr = vec.cbegin(); itr != vec.cend(); ++itr)
    

    有了auto之后可以:

    for(auto itr = vec.cbegin(); itr != vec.cend(); ++itr)
    
  • auto常见用法

    auto i = 5;	//auto被推导为int
    auto arr = new auto(10);  //auto被推导为int *
    
  • auto不可以用于函数传参,如下用法在C++11中是错误的

    int add(auto x, auto y)
    {
        return x+y;
    }
    int main()
    {
        cout<<add(5,6);
        return 0;
    }
    

    不过在C++14中可以正常编译通过

    int add(auto x, auto y)
    {
        return x+y;
    }
    int main()
    {
        cout<<add(5,6);
        return 0;
    }
    

    输出

    11
    
  • auto不能用与推导数组类型

    int main()
    {
        int arr[10] = {0};
        auto auto_arr = arr;
        auto auto_arr2[10] = arr;   //错误
        cout<<*auto_arr2;
        return 0;
    }
    

二、decltype

  • auto关键字只能对变量进行类型推导,decltype用法和sizeof很相似

    int main()
    {
        auto x = 1;
        auto y = 2;
        decltype(x+y) z; //推导结果为int。z的类型为int。
        return 0;
    }
    
  • 如果需要写一个模板函数实现加法运算,你可能需要这样写:

    template<typename R, typename T, typename U>
    R add(T x, U y) {
        return x+y;
    }
    
    int main()
    {
        cout<<add<int,int> (1,2);
        return 0;
    }
    

    这样写会显得很冗长,复杂,在C++11中,可以写成如下形式:

    template<typename T, typename U>
    auto add(T x, U y) -> decltype(x+y) {
        return x+y;
    }
    int main()
    {
        cout<<add<int,int> (1,2);
        return 0;
    }
    

    当然,在C++14中,可以写的更精简:

    template<typename T, typename U>
    auto add(T x, U y) {
        return x+y;
    }
    int main()
    {
        cout<<add<int,int> (1,2);
        return 0;
    }
    

    或者干脆去掉模板:

    auto add(auto x, auto y) {
        return x+y;
    }
    int main()
    {
        cout<<add(1.1,2);
        return 0;
    }
    
  • 参考:C++ 11/14 高速上手教程 - 语言可用性的强化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值