我有以下模板功能:
template <typename N>
inline N findInText(std::string line, std::string keyword)
{
keyword += " ";
int a_pos = line.find(keyword);
if (a_pos != std::string::npos)
{
std::string actual = line.substr(a_pos,line.length());
N x;
std::istringstream (actual) >> x;
return x;
}
else return -1; // Note numbers read from line must be always < 1 and > 0
}
看起来像是这条线:
std::istringstream (actual) >> x;
不起作用。 然而,相同的功能没有模板化:
int a_pos = line.find("alpha ");
if (a_pos != std::string::npos)
{
std::string actual = line.substr(a_pos,line.length());
int x;
std::istringstream (actual) >> x;
int alpha = x;
}
工作得很好。 它是std :: istringstream和templates ???
的问题我正在寻找一种方法来读取配置文件和加载参数,这些参数可以是int或real。
EDIT解决方案:
template <typename N>
inline N findInText(std::string line, std::string keyword)
{
keyword += " ";
int a_pos = line.find(keyword);
int len = keyword.length();
if (a_pos != std::string::npos)
{
std::string actual = line.substr(len,line.length());
N x;
std::istringstream (actual) >> x ;
return x;
}
else return -1;
}
答案 0 :(得分:1)
它不起作用,因为您正在读取的字符串无法转换为数字,因此您将返回未初始化的垃圾。这种情况正在发生,因为您正在阅读错误的字符串 - 如果line
为foo bar 345
且keyword
为bar
,那么actual
将设置为{{1} },它不会转换为整数。您想要转换bar 345
。
您应该像这样重写代码:
345
这样,您可以转换正确的子字符串,并且还可以在无法转换为整数的情况下正确处理该情况。