1. 程式人生 > >C++11:decltype型別推導及追蹤返回值型別

C++11:decltype型別推導及追蹤返回值型別

C++11:decltype型別推導及追蹤返回值型別

使用decltype進行自動型別推導

先看一段cppreference上面的解釋:decltype 指定符

可以看下面的一段程式碼:

#include <bits/stdc++.h>
using namespace std;
struct
{
    char *name;
} anon_u;
struct
{
    int d;
    decltype(anon_u) id; //沒有告訴id的型別,用decltype自動推導
} anon_s[100];           //匿名的struct陣列
int main() { decltype(anon_s) as;//注意 as 的型別。 return 0; }

再這段程式碼裡面,首先定義了一個匿名的結構體anon_u,然後又定義了一個新的匿名結構體,其中有一個成員id,這時候並沒有給它指明型別,而是讓編譯器自己去推導,指定id的型別為anon_u代表的這個型別。起到了重用匿名結構體的作用

比如以下程式碼可以更容易的看出decltype關鍵字的作用。

int a = 6;
decltype(a) c;//把c定義成a這個變數的型別
c = 21;
cout << c << endl;

泛型程式設計中結合auto,用於追蹤函式的返回值型別

這也是decltype最大的用途了。

template <typename _Tx, typename _Ty>
auto multiply(_Tx x, _Ty y)->decltype(_Tx*_Ty)
{
    return x*y;
}

追蹤返回型別的函式

作用是:可以將返回型別的宣告資訊放到函式引數列表的後面進行宣告。如:

普通函式宣告方式:

int func(char *ptr,int val);

追蹤返回型別的函式宣告

auto func(char *ptr.int val)->int;

追蹤返回型別在原本函式返回值的位置使用auto

關鍵字。

這個方法配合上面講的泛型程式設計中結合auto,用於追蹤函式的返回值型別,可以對程式開發靈活性有比較大的提高。