函數模板大致如下:
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個元素