gpt4 book ai didi

C++模板将字符串转换为数字

转载 作者:行者123 更新时间:2023-11-28 08:18:22 24 4
gpt4 key购买 nike

我有以下模板函数:

  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 和模板有问题吗???

我正在寻找一种读取配置文件和加载参数的方法,这些参数可以是整型或实型。

编辑解决方案:

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

最佳答案

它不起作用,因为您正在读取的字符串无法转换为数字,所以您返回的是未初始化的垃圾。发生这种情况是因为您读入了错误的字符串——如果 linefoo bar 345 并且 keywordbar,然后 actual 设置为 bar 345,它不会转换为整数。您反而想转换 345

你应该像这样重写你的代码:

    std::string actual = line.substr(a_pos + keyword.length());
N x;
if (std::istringstream (actual) >> x)
return x;
else
return -1;

这样,您就可以转换正确的子字符串,并且可以正确处理无法转换为整数的情况。

关于C++模板将字符串转换为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6879429/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com