C++11返回值类型后置

C++11引入返回值类型后置是为了解决函数返回值依赖参数类型的问题,提高泛型编程的可读性和灵活性。文中通过示例解释了如何使用返回值类型后置以及它在模板函数中的应用,同时对比了C++98/03的解决方案。此外,还展示了C++11新语法如何在复杂场景下简化代码,例如在函数重载和依赖表达式推导返回类型的情况。
摘要由CSDN通过智能技术生成

为什么需要C++11的新特性,返回值类型后置呢?

返回值类型后置语法,是为了解决函数返回值类型依赖于参数而导致难以确定返回值类型的问题。有了这种语法以后,对返回值类型的推导就可以用清晰的方式(直接通过参数做运算)描述出来,而不需要像 C++98/03 那样使用晦涩难懂的写法。

在泛型编程中,我们可能会遇到,通过参数运算得到的返回值如下面的例子。
在此之前,我当你了解了auto与decltype,不了解可以看看我以前的博客。

例子如下:

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

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


int main()
{
	char a = 'a';
	string b = "32";

	auto c = add<decltype(a + b)>(a, b);
	cout << "auto c: " << c << endl;

	system("pause");
}

好像这样也行, decltype(a+b) 直接得到返回值类型。但是函数外部,不应该知道函数的内部运算。

那根据之前所学,你可能想到用decltype得到返回值类型,并且写下下面一段

#include<iostream>

template <typename T, typename U>
decltype(t + u) add(T t, U u)  //前面的t、u未定义标识符
{
	return t + u;
}

但是编译器报错了,出现了未定义标识符t和u。出现这样的问题是因为 t、u 在参数列表中,而 C++ 的返回值是前置语法,在返回值定义的时候参数变量还不存在。

在C++1.0(也就是C++98)可以这样写(可行方法)

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

在C++2.0(C++11)新增加了返回值类型后置(又称跟踪返回类型)的语法,将 decltype 和 auto 结合起来完成返回值类型的推导

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

这个写法比较与C++1.0的看起来简洁,增加了阅读性。当然啦,有些复杂的例子C++1.0是做不到的。

#include <iostream>
using namespace std;

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


using namespace std;
int main()
{
	float f = 3.14;
	int i = 3;
	auto a = func<int>(i);
	cout << a << endl; //输出3

	auto b = func<float>(f);
	cout << b << endl;//输出3.14
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

困了就喝白茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值