c++ - 排除一种类型的模板

标签 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;
}

我该怎么做?

最佳答案

根据您的意思排除类型 stringchar 。如果您不希望它链接,您可以声明但不定义类型的特化:

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;
}

请注意,这不是模板,而是常规函数。当调用的参数完全匹配时,非模板函数将比模板函数更好地匹配。

关于c++ - 排除一种类型的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12791816/

相关文章:

c++ - 顺序对类模板中函数的特化有影响吗

c++ - 通过组合实现仿函数重载

c++ - 通过引用 "std::lock_guard<mutex>"返回共享对象是否安全?

c - 是否可以在不再次打印的情况下修改打印的字符串?

c++ - 如何正确访问好友功能?

java - 从 Java 中的字符串中删除停用词

c - 将 char 数组分配给 char*

c++ - 为什么 SFINAE (enable_if) 从类定义内部工作而不是从外部工作

c++ - Mongodb C++ API 插入二进制文件(图片)

c++ - 重载运算符以将我自己的类作为标准类处理是一种好习惯吗?