国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++11返回類型后置語法的使用示例

2020-05-23 13:45:52
字體:
來源:轉載
供稿:網友

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上。

返回值類型后置語法,是為了解決函數返回值類型依賴于參數而導致難以確定返回值類型的問題。有了這種語法以后,對返回值類型的推導就可以用清晰的方式描述出來。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 惠州市| 九江县| 封开县| 普洱| 平山县| 海林市| 历史| 七台河市| 宣恩县| 云林县| 凤山县| 曲周县| 武汉市| 台湾省| 大关县| 青岛市| 涡阳县| 渭南市| 景谷| 五台县| 江山市| 莆田市| 乐平市| 盈江县| 永春县| 乡城县| 寻乌县| 海南省| 大冶市| 田阳县| 盐边县| 江阴市| 湖北省| 崇仁县| 宜州市| 镇江市| 沽源县| 南康市| 张家界市| 电白县| 谷城县|