我有一個模板函式,它將陣列參考作為引數:
template<typename T, int arrSize>
void foo(T (&pArr)[arrSize]) {
cout << "base template function" << endl;
}
我想將此函式專門用于 C 字串:
template<const char *, int arrSize>
void foo(const char * (&pArr)[arrSize]) {
cout << "specialized template function" << endl;
}
我嘗試實體化基礎和專業化:
int main(int argc, const char **argv) {
float nums[] = {0.3, 0.2, 0.11};
const char *words[] = {"word1", "word2"};
foo(nums);
foo(words);
}
但我似乎只得到了基本實體:
./foo
base template function
base template function
我在 Mac 上使用帶有 -std=c 17 的 clang 編譯了這個。
uj5u.com熱心網友回復:
問題是您提供的第二個多載const char*函式模板具有無法從函式引數推匯出的型別的非型別模板引數。所以要呼叫這個多載版本,我們必須顯式地提供與這個非型別引數對應的模板引數。
要解決這個問題,只需洗掉第一個非型別模板引數,如下所示:
template<typename T, int arrSize>
void foo(T (&pArr)[arrSize]) {
std::cout << "base template function" << std::endl;
}
//overload for C-strings
template< int arrSize>
void foo(const char (&pArr)[arrSize]) {
std::cout << "single C-string overloaded version" << std::endl;
}
//overload for array of pointers to C-strings
template<std::size_t arrSize>
void foo(const char*(&pArr)[arrSize])
{
std::cout<<" array of pointers to C-string version"<<std::endl;
}
int main(int argc, const char **argv) {
float nums[] = {0.3, 0.2, 0.11};
const char words[] = {"word1"};
const char* wordPtrs[] = {"word1", "word2"};
foo(nums); //calls base
foo(words);//calls single C-string version
foo(wordPtrs);//calls array of pointers to C-string version
}
演示
另請注意,函式模板不能部分特化,但可以完全特化或多載。
uj5u.com熱心網友回復:
嘗試:
template<int arrSize>
void foo(const char * (&pArr)[arrSize]);
您正在定義一個需要不可推導的char const*非型別引數的多載。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467043.html
