<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    C++11新特性:自動類型推斷和類型獲取

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    聲明:本文是在Alex Allain的文章http://www.cprogramming.com/c++11/c++11-auto-decltype-return-value-after-function.html的基礎上寫成的。

    加入了很多個人的理解,不是翻譯。

     

    轉載請注明出處 http://blog.csdn.net/srzhz/article/details/7934483

     

    自動類型推斷

    當編譯器能夠在一個變量的聲明時候就推斷出它的類型,那么你就能夠用auto關鍵字來作為他們的類型:

     

    [cpp] view plaincopy  
    1. auto x = 1;  


    編譯器當然知道x是integer類型的。所以你就不用int了。接觸過泛型編程或者API編程的人大概可以猜出自動類型推斷是做什么用的了:幫你省去大量冗長的類型聲明語句。

     

    比如下面這個例子:

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

    [cpp] view plaincopy  
    1. vector<int> vec;  
    2. vector<int>::iterator itr = vec.iterator();  

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

     

     

    [cpp] view plaincopy  
    1. vector<int> vec;  
    2. auto itr = vec.iterator();  

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

     

    比如說有這樣的代碼:

     

    [cpp] view plaincopy  
    1. template <typename BuiltType, typename Builder>  
    2. void  
    3. makeAndProcessObject (const Builder& builder)  
    4. {  
    5.     BuiltType val = builder.makeObject();  
    6.     // do stuff with val  
    7. }  

    這個函數的功能是要使用builder的makeObject產生的實例來進行某些操作。但是現在引入了泛型編程。builder的類型不同,那么makeObject返回的類型也不同,那么我們這里就得引入兩個泛型。看起來很復雜是吧,所以這里就可以使用自動類型推斷來簡化操作:

    [cpp] view plaincopy  
    1. template <typename Builder>  
    2. void  
    3. makeAndProcessObject (const Builder& builder)  
    4. {  
    5.     auto val = builder.makeObject();  
    6.     // do stuff with val  
    7. }  


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

     

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

     

    新的返回值語法和類型獲取(Decltype)語句

      在原來,我們聲明一個函數都是這樣的: [cpp] view plaincopy  
    1. int temp(int a, double b);  

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

    現在你可以將函數返回值類型移到到參數列表之后來定義:

     

    [cpp] view plaincopy  
    1. auto temp(int a, double b) -> int;  


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

     

     

    [cpp] view plaincopy  
    1. class Person  
    2. {  
    3. public:  
    4.     enum PersonType { ADULT, CHILD, SENIOR };  
    5.     void setPersonType (PersonType person_type);  
    6.     PersonType getPersonType ();  
    7. private:  
    8.     PersonType _person_type;  
    9. };  


    那么在定義getPersonType函數的時候我們得這么寫:

     

     

    [cpp] view plaincopy  
    1. Person::PersonType Person::getPersonType ()  
    2. {  
    3.     return _person_type;  
    4. }  


    因為函數所在的類Person是聲明在函數返回值之后的,所以在寫返回值的時候編譯器并不知道這個函數是在哪個類里面。由于PersonTYpe是Person類的內部聲明的枚舉,所以在看到PersonType的時候,編譯器是找不到這個類型的。所以你就得在PersonTYpe前面加上Person::,告訴編譯器這個類型是屬于Person的。這看起來有點麻煩是吧。當你使用新的返回值語法的時候呢就可以這么寫:

     

     

    [cpp] view plaincopy  
    1. auto Person::getPersonType () -> PersonType  
    2. {  
    3.     return _person_type;  
    4. }  


    因為這次編譯器看到返回值類型PersonType的時候已經知道這個函數屬于類Person。所以它會到Person類中去找到這個枚舉類型。

     

     

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

     

    類型獲取(Decltype)

      既然編譯器能夠推斷一個變量的類型,那么我們在代碼中就應該能顯示地獲得一個變量的類型信息。所以C++介紹了另一個功能:decltype。(實在是不知道這個詞該怎么翻譯,姑且稱之為類型獲取)。   [cpp] view plaincopy  
    1. int x = 3;  
    2. decltype(x) y = x; // same thing as auto y = x;  

    上述代碼就使用了類型獲取功能。和函數返回值后置語法結合起來,可以有如下應用: [cpp] view plaincopy  
    1. template <typename Builder>  
    2. auto  
    3. makeAndProcessObject (const Builder& builder) -> decltype( builder.makeObject() )  
    4. {  
    5.     auto val = builder.makeObject();  
    6.     // do stuff with val  
    7.     return val;  
    8. }  

    前面的例子中這個函數的返回值是void,所以不需要為返回值引入泛型。如果返回值是makeObject的返回值的話,那么這個函數就得引入兩個泛型。現在又了類型獲取功能,我們就能在返回值中自動推斷makeObject的類型了。所以decltype確實為我們提供了很大的便利。   這個功能非常重要,在很多時候,尤其是引入了泛型編程的時候,你可能記不住一個變量的類型或者類型太過復雜以至于寫不出來。你就要靈活使用decltype來獲取這個變量的類型。

    自動類型推斷在Lambda表達式(匿名函數)中的作用

    請參考http://blog.csdn.net/srzhz/article/details/7934652

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全