用于检查“is int”/“is double”/ etc的模板函数

时间:2017-07-20 06:29:44

标签: c++ templates

我对C ++模板语法有点不稳定,所以我不确定我想象的是否可能,如果是,我不清楚语法是否正确。

我想实现template<int> bool is( std::string& )template<double> bool is( std::string& )等模板功能,以便我可以拨打is <int> (...)is <double> (...)而不是isInt(...)或{ {1}}等等这可能吗?如果是这样,您将如何编写功能签名?

由于我对模板语法的了解很少,我的尝试是:

isDouble(...)

此操作失败并出现以下错误:

#include <iostream>
#include <cstdlib>

template<int>
bool is( std::string& raw )
{
    if ( raw.empty() ) return false;
    char* p;
    int num = strtol( raw.c_str(), &p, 10);
    return ( ( *p != '\0' ) ? false : true );
}

int main( int argc, char* argv[] )
{
    std::string str("42");
    std::cout << std::boolalpha << is <int> ( str ) << std::endl;
    return 0;
}

2 个答案:

答案 0 :(得分:6)

我对你的帖子的评论很容易,方法是使用std::istringstream类解析的简单模板:

template<typename T>
bool is(std::string const& raw) {
  std::istringstream parser(raw);

  T t; parser >> t;
  return !parser.fail() && parser.eof();
}

显而易见的警告是T必须是默认构造的。但从好的方面来说,上述内容也适用于用户定义的类型,只要它们实现operator >>

答案 1 :(得分:3)

您需要使用模板专业化:

#include <iostream>
#include <cstdlib>

template<class T> bool is(std::string& raw) = delete;

template<>
bool is<int>( std::string& raw )
{
    if ( raw.empty() ) return false;
    char* p;
    int num = strtol( raw.c_str(), &p, 10);
    return ( ( *p != '\0' ) ? false : true );
}

int main( int argc, char* argv[] )
{
    std::string str("42");
    std::cout << std::boolalpha << is <int> ( str ) << std::endl;
    return 0;
}

您可以在here

中详细了解