C 11新特性 自動型別推斷和型別獲取

2021-06-17 20:50:47 字數 3364 閱讀 8879

當編譯器能夠在乙個變數的宣告時候就推斷出它的型別,那麼你就能夠用auto關鍵字來作為他們的型別:

[cpp]view plain

copy

auto x = 1;  

編譯器當然知道x是integer型別的。所以你就不用int了。接觸過泛型程式設計或者api程式設計的人大概可以猜出自動型別推斷是做什麼用的了:幫你省去大量冗長的型別宣告語句。

比如下面這個例子:

在原來的c++中,你要想使用vector的迭代器得這麼寫:

[cpp]view plain

copy

vector<

int> vec;  

vector>::iterator itr = vec.iterator();  

看起來就很不爽。現在你可以這麼寫了:

[cpp]view plain

copy

vector<

int> vec;  

auto itr = vec.iterator();  

果斷簡潔多了吧。假如說自動型別推斷只有這樣的用法的話那未免也太*****了。在很多情況下它還能提供更深層次的便利。

比如說有這樣的**:

[cpp]view plain

copy

template

<

typename

builttype, 

typename

builder>  

void

makeandprocessobject (const

builder& builder)    

這個函式的功能是要使用builder的makeobject產生的例項來進行某些操作。但是現在引入了泛型程式設計。builder的型別不同,那麼makeobject返回的型別也不同,那麼我們這裡就得引入兩個泛型。看起來很複雜是吧,所以這裡就可以使用自動型別推斷來簡化操作:

[cpp]view plain

copy

template

<

typename

builder>  

void

makeandprocessobject (const

builder& builder)    

因為在得之builder的型別之後,編譯器就已經能知道makeobject的返回值型別了。所以我們能夠讓編譯器自動去推斷val的型別。這樣一來就省去了乙個泛型。

你以為自動型別推斷只有這樣的用法?那也太*****了。c++11還允許對函式的返回值進行型別推斷

在原來,我們宣告乙個函式都是這樣的:

[cpp]view plain

copy

inttemp(

inta, 

double

b);  

前面那個int是函式的返回值型別,temp是函式名,int a, double b是引數列表。

現在你可以將函式返回值型別移到到引數列表之後來定義:

[cpp]view plain

copy

auto temp(

inta, 

double

b) -> 

int;  

後置返回值型別可以有很多用處。比如有下列的類定義:

[cpp]view plain

copy

class

person  

;  void

setpersontype (persontype person_type);  

persontype getpersontype ();  

private

:  persontype _person_type;  

};  

那麼在定義getpersontype函式的時候我們得這麼寫:

[cpp]view plain

copy

person::persontype person::getpersontype ()    

因為函式所在的類person是宣告在函式返回值之後的,所以在寫返回值的時候編譯器並不知道這個函式是在哪個類裡面。由於persontype是person類的內部宣告的列舉,所以在看到persontype的時候,編譯器是找不到這個型別的。所以你就得在persontype前面加上person::,告訴編譯器這個型別是屬於person的。這看起來有點麻煩是吧。當你使用新的返回值語法的時候呢就可以這麼寫:

[cpp]view plain

copy

auto person::getpersontype () -> persontype    

因為這次編譯器看到返回值型別persontype的時候已經知道這個函式屬於類person。所以它會到person類中去找到這個列舉型別。

當然上述應用只能說是乙個奇技淫巧而已。並沒有幫我們多大的忙(**甚至都沒有變短)。所以還得引入c++11的另乙個功能。

既然編譯器能夠推斷乙個變數的型別,那麼我們在**中就應該能顯示地獲得乙個變數的型別資訊。所以c++介紹了另乙個功能:decltype。(實在是不知道這個詞該怎麼翻譯,姑且稱之為型別獲取)。

[cpp]view plain

copy

intx = 3;  

decltype(x) y = x; // same thing as auto y = x;

上述**就使用了型別獲取功能。和函式返回值後置語法結合起來,可以有如下應用:

[cpp]view plain

copy

template

<

typename

builder>  

auto  

makeandprocessobject (const

builder& builder) -> decltype( builder.makeobject() )    

前面的例子中這個函式的返回值是void,所以不需要為返回值引入泛型。如果返回值是makeobject的返回值的話,那麼這個函式就得引入兩個泛型。現在又了型別獲取功能,我們就能在返回值中自動推斷makeobject的型別了。所以decltype確實為我們提供了很大的便利。

這個功能非常重要,在很多時候,尤其是引入了泛型程式設計的時候,你可能記不住乙個變數的型別或者型別太過複雜以至於寫不出來。你就要靈活使用decltype來獲取這個變數的型別。

**:

C 11 自動型別推斷和型別獲取

1.自動型別判斷 編譯器能夠在乙個變數的宣告時候推斷出它的型別,那麼你就能夠用auto 關鍵字來作為他們的型別。接觸過泛型程式設計或者api程式設計的人大概可以猜出自動型別推斷是做什麼用的了 幫你省去大量冗長的型別宣告語句。如下 vector vec vector iterator itr vec....

C 11新特性之POD型別

pod plain old data 是c 中非常重要的乙個概念,用來描述乙個型別的屬性其中plain表示這個型別是個平凡的型別,old表示其與c的相容性。c 11中將pod劃分為兩個基本概念 平凡的 trival 和標準布局 standardlayout 什麼是平凡性呢?通常乙個平凡的類或者結構體...

c 11 型別推斷

當編譯器能夠在乙個變數的宣告時候就推斷出它的型別,那麼你就能夠用auto關鍵字來作為他們的型別 cpp view plain copy auto x 1 編譯器當然知道x是integer型別的。所以你就不用int了。接觸過泛型程式設計或者api程式設計的人大概可以猜出自動型別推斷是做什麼用的了 幫你...