我对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;
}
答案 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
中详细了解