取决于排除类型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
and 优先:
void parse( std::string& v, const std::string& token ) {
v = token;
}
请注意,这不是模板,而是常规函数。当调用的参数完全匹配时,非模板函数将比模板函数更好地匹配。