2

我想做一个不包括字符串或字符类型的解析函数

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

我怎样才能做到这一点?

4

3 回答 3

3

取决于排除类型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没有解析为类型。

通常,您可能想要的是提供不同的重载来执行特定版本的parseand 优先:

void parse( std::string& v, const std::string& token ) {
    v = token;
}

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

于 2012-10-09T02:06:37.863 回答
0

您可以使用增强型特征。他们有一个名为 is_same 的类型比较检查

http://www.boost.org/doc/libs/1_51_0/libs/type_traits/doc/html/boost_typetraits/reference/is_same.html

您可以将比较结果用于 char 和 string。

于 2012-10-09T02:05:58.217 回答
0

模板应该在 David Rodríguez 的方法中这样声明(对于具有返回类型的函数):

template <template T, typename std::enable_if<!std::is_same<T,std::string>::value>::type* = nullptr >
T func(T x){}

对于多个条件:

template <template T, typename std::enable_if<!std::is_same<T,std::string>::value &&!std::is_same<T,int>::value>::type* = nullptr >
T func(T x){}

对于没有返回类型的函数:

template <template T>
typename std::enable_if<!std::is_same<T,std::string>::value>::type
func(T x){}

对于多个条件:

template <template T>
typename std::enable_if<!std::is_same<T,std::string>::value &&!std::is_same<T,int>::value>::type
func(T x){}

不要忘记包括#include <type_traits>

于 2015-03-09T01:21:48.423 回答