C++11返回类型后置语法的使用示例

 更新时间:2017年10月11日 09:50:14   作者:阿阿阿阿阿阿鑫  
本篇文章主要介绍了C++11返回类型后置语法的使用示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

C++11新标准增加的auto不仅可以自动推断变量类型,还能结合decltype来表示函数的返回值。这些新特性可以让我们写出更简洁、更现代的代码。

在泛型编程中,可能需要通过参数的运算来得到返回值的类型。

我们看一下下面这个例子:

#include<iostream>
using namespace std;


template <typename R,typename T, typename U>
R add(T t,U u)
{
  return t+u;
}

int main()
{
  int a=1;
  float b=2.0;
  auto c = add<decltype(a+b)>(a,b);
}

我们并不关心a+b类型是什么,因为,只需要通过decltype(a+b)直接得到返回值类型即可。但像上面这样使用十分不方便,因为外部其实并不知道参数之间应该如何运算,只有add函数才知道返回值应当如何推导。

那么我们可不可以直接在函数定义上通过decltype拿到返回值呢?比如像这样:

template <typename T, typename U>
decltype(t+u) add(T t,U u)      //编译错误,t,u未定义
{
  return t+u;
}

运行后,编译器会提示错误,告诉我们decltype(t+u)中t和u在此作用域中尚未声明。

因为t、u在参数列表中,而C++的返回值是前置语法,在返回值定义的时候参数变量还不存在。

对于本例子,可行的写法如下:

template <typename T, typename U>
decltype(T()+U()) add(T t,U u)    
{
  return t+u;
}

考虑到T、U可能是没有无参构造函数的类,正确的写法应该是这样:

template <typename T, typename U>
decltype((*(T*)0)+(*(U*)0)) add(T t,U u)    
{
  return t+u;
}

虽然成功地使用decltype完成了返回值的推导,但写法过于晦涩,会大大增加decltype在返回值类型推导上的使用难度并降低了代码的可读性。

因此,在C++11中增加了返回类型后置语法,将decltype和auto结合起来完成返回值类型的推导。

返回类型后置语法是通过auto和decltype结合起来使用的。上面的add函数,使用新的语法可以写成:

template <typename T, typename U>
auto add(T t,U u) ->decltype(t+u)    
{
  return t+u;
}

为了进一步说明这个语法,再看另一个例子:

#include<iostream>
using namespace std;


int& foo(int& i);
float foo(float& f);

template <typename T>
auto func(T& val) -> decltype(foo(val))
{
  return foo(val);
}

在这个例子中,使用decltype结合返回值后置语法很容易推导出了foo(val)可能出现的返回值类型,并将其用到了func上。

返回值类型后置语法,是为了解决函数返回值类型依赖于参数而导致难以确定返回值类型的问题。有了这种语法以后,对返回值类型的推导就可以用清晰的方式描述出来。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C++分析类的对象作类成员调用构造与析构函数及静态成员

    C++分析类的对象作类成员调用构造与析构函数及静态成员

    终于到了对象的初始化和清理的最后阶段了,在这里分享一个cpp里有多个类时,一个类的对象作为另一个类成员的时候构造函数和析构函数调用的时机。还有一个静态成员也是经常考到的点,在这篇博客将会详解其概念并举出案例巩固,让我们开始
    2022-05-05
  • C语言求质数的几种简单易懂方式

    C语言求质数的几种简单易懂方式

    这篇文章主要介绍了C语言求质数的几种简单易懂方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 如何用C++实现双向循环链表

    如何用C++实现双向循环链表

    本篇文章是对用C++实现双向循环链表的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++超详细讲解贪心策略的设计及解决会场安排问题

    C++超详细讲解贪心策略的设计及解决会场安排问题

    为了更好的应对《算法设计与分析》这门课程,我把书上以及老师讲过的案例都详细的做一个重现及解剖,让你熟记每一个潜在的考点,希望能给大家帮助
    2022-05-05
  • 如何基于C语言socket编程实现TCP通信

    如何基于C语言socket编程实现TCP通信

    本文介绍了如何基于C语言socket编程实现TCP通信,下面小编来简单介绍下
    2019-05-05
  • C++ OpenCV实现与添加椒盐噪声和高斯噪音

    C++ OpenCV实现与添加椒盐噪声和高斯噪音

    图像噪声是图像在获取或是传输过程中受到随机信号干扰,妨碍人们对图像理解及分析处理的信号,本文为大家整理了C++结合OpenCV为图像添加椒盐噪声和高斯噪音的代码,需要的可以收藏一下
    2023-09-09
  • C语言的getc()函数和gets()函数的使用对比

    C语言的getc()函数和gets()函数的使用对比

    这篇文章主要介绍了C语言的getc()函数和gets()函数的使用对比,从数据流中一个是读取字符一个是读取字符串,需要的朋友可以参考下
    2015-08-08
  • C++实例输入多行数字到数组

    C++实例输入多行数字到数组

    这篇文章主要介绍了C++实例输入多行数字到数组的相关资料,这里提供实例代码帮助大家学习理解,需要的朋友可以参考下
    2016-12-12
  • 详解C++ 共享数据保护机制

    详解C++ 共享数据保护机制

    这篇文章主要介绍了详解C++ 共享数据保护机制的相关资料,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下
    2021-02-02
  • c语言实现词频统计的简单实例

    c语言实现词频统计的简单实例

    下面小编就为大家带来一篇c语言实现词频统计的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09

最新评论