zoukankan      html  css  js  c++  java
  • Trailing return types

        Trailing return types是C++11关于函数声明的语言特性之一,旨在解决模版编程遇到的语法相关的问题,先看一个简单例子,感受一下什么是trailing return types:

    C++03:

    int func(int i, int j);

    C++11可以写成:

    auto func(int i, int j) -> int;

    最直观感受就是,函数返回类型声明后置.

    新的声明方式配合模版,可以使编译器自动推导模版函数的返回类型,使模版函数更泛化,例如:

    C++03:

    template<typename C1, typename C2, typename Ret>

    Ret func(C1 i, C2 j){ return i + j;}

     当你这样调用func(1, 2.0);编译器会告诉你,无法推导模版参数Ret.

    调用函数时必须指定模版参数func<int, double, double>(1, 2.0);

    这种声明方式即使在C++11,也无法配合decltype来推导,例如:decltype(i + j) func(C1 i, C2 j);因为decltype时,i j都还没有声明,为了解决这个问题,C++11引入了Trailing return types,看看怎么解决:

    C++11:

    template<typename C1 , typename C2 >
    auto func(C1 i, C2 j)->decltype(i + j){ return i + j; }

    把函数返回类型声明后置与函数形参声明,就可以启动decltype了。

    明显地,使用Trailing return types的模版函数更泛用,因为函数所有的类型都能通过编译器自动推导,无需在源代码中显式指定。

    Trailing return types另一个好处就是增强代码可读性:

    C++03:

    template <class T> class tmp

    {

    public:

    int i;

    };

    tmp<int> (*(*foo())())()

    {

    return 0;

    }

    知道foo的返回类型是什么吗?再看

    C++11:

     

    template <class T> class tmp

    {

     

    public:

     

    int i;

     

    };

     

    auto foo()->auto(*)()->tmp<int>(*)()

    {

     

    return 0;

     

    }

    这样应该清晰了吧,foo返回的是一个函数指针,这个函数指针的返回类型是tmp<int>(*)()函数指针.

     

    参考

    https://www.ibm.com/developerworks/community/blogs/5894415f-be62-4bc0-81c5-3956e82276f3/entry/introduction_to_the_c_11_feature_trailing_return_types?lang=en

     

  • 相关阅读:
    mysql数据库开放远程连接的方法
    MySQL数据库字符集由utf8修改为utf8mb4一例
    解决silk-v3-decoder-master转换wav时,百度语音解析问题
    PHP高效率写法(详解原因)
    如何计算服务器能够承受多大的pv?
    微信开发中使用curl忽略https证书
    PHP libevent函数基本介绍
    PHP stream相关协议及上下文选项和参数归纳
    Centos搭建PHP5.3.8+Nginx1.0.9+Mysql5.5.17
    编码转换(UTF8->GBK)
  • 原文地址:https://www.cnblogs.com/rickerliang/p/3430829.html
Copyright © 2011-2022 走看看