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

时间:2011-07-29 21:54:30

标签: c++ templates

我有以下模板功能:

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

1 个答案:

答案 0 :(得分:1)

它不起作用,因为您正在读取的字符串无法转换为数字,因此您将返回未初始化的垃圾。这种情况正在发生,因为您正在阅读错误的字符串 - 如果linefoo bar 345keywordbar,那么actual将设置为{{1} },它不会转换为整数。您想要转换bar 345

您应该像这样重写代码:

345

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