取決於你的意思是不包括類型string
或char
。如果你想讓它不鏈接你可以聲明而不是類型定義專業:
template <>
void parse<std::string>(std::string & value, const std::string& token);
編譯器將看到的專業化,而不是生成代碼。鏈接器將失敗,因爲符號未在任何翻譯單元中定義。
第二種方法,有點複雜的是不要在鏈接時失敗,但要讓編譯器不接受這些類型的模板。這可以用SFINAE,這是在C++ 11簡單做,但如果你需要一個C++ 03解決方案,您可以谷歌或添加評論:
template <typename T,
typename = typename std::enable_if<!std::is_same<T,std::string>
&& !std::is_same<T,char>>::type >
void parse(T & t, const std::string& token) {
// ...
}
(我沒有經歷過這種運行一個編譯器,所以語法可能會有點偏離,玩它)編譯器將看到模板,並且當它試圖執行T
類型的替換時,由於std::enable_if<...>::type
未解析爲類型,它將失敗。
在一般情況下,你可能想要的是提供執行parse
特定版本的不同過載和優先:
void parse(std::string& v, const std::string& token) {
v = token;
}
請注意,這不是一個模板,但常規的函數。當模板函數的參數是完美匹配時,非模板函數將比模板函數更好匹配。
爲什麼?爲什麼不把它稱爲字符串或字符......要容易得多。 – Annabelle
你想爲字符串和字符發生什麼?那麼char指針和數組呢? –
我正在接受一個輸入,該輸入應該有一個數組序列,我將它存儲在一個數組中。然後理想情況下,應該有數字後面的字符。我需要將數字解析爲適當的類型,然後將它們存儲到模板數組中,我有其他地方。 – Painguy