C ++ / Boost:编写更强大的sscanf替换

我想用C ++编写一个函数来替换C的sscanf,它将匹配分配给迭代器。

基本上,我想要的东西是:

string s = "0.5 6 hello";
std::vector<boost::any> any_vector;
sscanv(s, "%f %i %s", any_vector);
cout << "float: " << any_cast<float>(any_vector[0]);
cout << "integer: " << any_cast<integer(any_vector[1]);
cout << "string: " << any_cast<string>(any_vector[2]);

确切的细节可能会有所不同,但你明白了。 任何想法的实施?

迄今为止的选项以及迄今为止的问题:

  • std :: istringstream :没有用于匹配常量表达式的操纵器
  • Boost.Regex :不确定这是否会起作用,而且看起来比这更复杂
  • Boost.Spirit :不要认为这将适用于动态生成的格式字符串,它似乎也更复杂,然后有必要
  • sscanf :它可以工作,但不是标准的,等等,使用它需要很多的开销,因为参数的数量是在编译时确定的

  • 那是什么?

    void sscanf(std::string str,
                const std::string& format,
                std::vector<boost::any>& result)
    {
      std::string::const_iterator i = format.begin();
      while (i != format.end())
      {
        if (*i == '%')
        {
          ++i; // now *i is the conversion specifier
          char specifier = *i;
    
          ++i; // now *i is the next seperator
          std::string extract = str.substr(0, str.find(*i));
    
          switch (specifier) 
          {
            // matching an integer
            case 'i':
              result.push_back(boost::lexical_cast<int>(extract));
              break;
            // matching a floating point number
            case 'a': case 'e': case 'f': case 'g':
              result.push_back(boost::lexical_cast<float>(extract));
              break;
            // matching a single character
            case 'c':
              result.push_back(boost::lexical_cast<char>(extract));
              break;
            // matching a string
            case 's':
              result.push_back(extract);
              break;
            // Invalid conversion specifier, throwing an exception
            default:
              throw std::runtime_error("invalid conversion specifier");
              break;
          }
        }
        else
        {
          // if it's not a %, eat!
          str.erase(0, str.find(*i)+1);
          ++i;
        }
      }
    }
    

    一些转换说明符丢失 - 但主要是它的工作原理。


    如果你的格式字符串是在编译时确定的,那么写一些可变参数模板printf替换。 反转这些应该工作得很好。

    然后你可以使用istream的>>操作符来读取,或者使用c-stdlib函数。

    链接地址: http://www.djcxy.com/p/50831.html

    上一篇: C++/Boost: Writing a more powerful sscanf replacement

    下一篇: ASP.NET MVC Display Template for strings is used for integers