c++ 類型推導

函數模板大致如下:

template<typename T>
void f(ParamType param);

調用的時候 f(expr);

在編譯期,編譯器會通過expr來推導T的類型和ParamType的類型,這兩個類型不一定是一樣的。

模板型別推導分三種情況,

template<typename T>
void f(T& param);    //param是個引用
template<typename T>
void f(T&& param);     //param現在是個萬能引用
template<typename T>
void f(T param);        //param現在是按值傳遞

1、對按值傳遞的形參進行推導時,若實參類型中帶有const或者volatile,則他們還是會被當作不帶修飾詞的類型來處理;

2、在模板類型推導過程中,數組或者函數類型的實參會退化成對應的指針,除非他們被用來初始化引用。

3、其他,constexpr能夠使其返回值在編譯期就可用;

 


內建數組

template<typename T, std::size_t N>
constexpr std::size_t arraySize(T (&)[N]) noexcept
{
    return N;
}

int KeyVals[]={1,2,3,4,5,6,7,9};    //含有8個元素
int mappedVals[arraySize(KeyVals)];

//現代c++程序員,相對於內建數組,會優先選優std::array

std::array<int, arraySize(KeyVals)> mappedVals;    //mappedVals也指定8個元素

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章