Pai*_*guy 3 c++ string templates types char
我想创建一个排除字符串或字符类型的解析函数
template <typename T>
bool parse(T & value, const string & token){
istringstream sin(token);
T t;
if( !(sin >>t) ) return false;
char junk;
if( sin >>junk ) return false;
value = t;
return true;
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
取决于您排除类型string或的char含义。如果您不希望它链接,您可以声明但不定义类型的专业化:
template <>
void parse<std::string>( std::string & value, const std::string& token );
Run Code Online (Sandbox Code Playgroud)
编译器将看到专门化,但不会生成代码。由于该符号未在任何翻译单元中定义,因此链接器将失败。
第二种方法稍微复杂一些,不是在链接时失败,而是使编译器不接受这些类型的模板。这可以使用 SFINAE 来完成,它在 C++11 中更简单,但如果您需要 C++03 解决方案,您可以通过 google 搜索它或添加注释:
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 ) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
(我没有通过编译器运行它,所以语法可能有点不对,请使用它)编译器将看到模板,当它尝试执行类型替换时,T由于未std::enable_if<...>::type解析为类型。
一般来说,您可能想要的是提供执行特定版本的不同重载parse并优先:
void parse( std::string& v, const std::string& token ) {
v = token;
}
Run Code Online (Sandbox Code Playgroud)
请注意,这不是模板,而是常规函数。当调用的参数完全匹配时,非模板化函数将比模板化函数更好地匹配。
| 归档时间: |
|
| 查看次数: |
5123 次 |
| 最近记录: |