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

     

  • 相关阅读:
    NYOJ 10 skiing DFS+DP
    51nod 1270 数组的最大代价
    HDU 4635 Strongly connected
    HDU 4612 Warm up
    POJ 3177 Redundant Paths
    HDU 1629 迷宫城堡
    uva 796
    uva 315
    POJ 3180 The Cow Prom
    POJ 1236 Network of Schools
  • 原文地址:https://www.cnblogs.com/rickerliang/p/3430829.html
Copyright © 2011-2022 走看看