C++ 重载C+的示例+;提取操作员>&燃气轮机;解析数据

C++ 重载C+的示例+;提取操作员>&燃气轮机;解析数据,c++,parsing,operator-overloading,C++,Parsing,Operator Overloading,我正在寻找一个很好的例子,说明如何重载流输入操作符(操作符>>),以使用简单的文本格式解析一些数据。我读过,但我想做一些更高级的事情。在我的例子中,我有固定的字符串,我想检查(并忽略)。假设链接中的2D点格式更像 Point{0.3 => 0.4 } 其中,预期效果是解析出数字0.3和0.4。(是的,这是一个非常愚蠢的语法,但它包含了我需要的几个想法)。我主要只是想看看如何正确地检查固定字符串的存在,忽略空白,等等 更新: 哎呀,我下面的评论没有格式(这是我第一次使用这个网站

我正在寻找一个很好的例子,说明如何重载流输入操作符(操作符>>),以使用简单的文本格式解析一些数据。我读过,但我想做一些更高级的事情。在我的例子中,我有固定的字符串,我想检查(并忽略)。假设链接中的2D点格式更像

Point{0.3 =>
      0.4 }
其中,预期效果是解析出数字0.3和0.4。(是的,这是一个非常愚蠢的语法,但它包含了我需要的几个想法)。我主要只是想看看如何正确地检查固定字符串的存在,忽略空白,等等

更新: 哎呀,我下面的评论没有格式(这是我第一次使用这个网站)。 我发现空格可以用类似的东西跳过

std::cin >> std::ws;
我吃了很多线

static bool match_string(std::istream &is, const char *str){
    size_t nstr = strlen(str);
    while(nstr){
        if(is.peek() == *str){
            is.ignore(1);
            ++str;
            --nstr;
        }else{
            is.setstate(is.rdstate() | std::ios_base::failbit);
            return false;
        }
    }
    return true;
}
现在,能够获得解析错误的位置(行号)就好了

更新2: 行号和注释解析工作正常,只需1个字符。最终结果可以在函数parse()中看到。该项目是一个(DE)可序列化的C++ PHP类数组类。

< P>操作符>(istrAM&Objor)应该使用它的格式化和/或未格式化的提取函数从输入流中获取数据,并将其放入对象中。

如果您想更安全(在某种程度上),请在开始之前构造并测试一个istream::sentry对象。如果遇到语法错误,可以调用
setstate(ios\u base::failbit)
以阻止任何其他处理,直到调用my\u stream.clear()


例如,请参见
(如果您使用的是SGI STL,请参阅istream.tcc)。

它不是“提取”或“流输入”运算符,而是“位移位”运算符。流IO版本本身就是原始C操作符的重载版本,在实践中使用相对较少。克里斯:虽然我不反对你的观点,但引用“>>”和“@GRB:操作符重载”似乎是公认的做法。位右移位算子已经被C++ STL滥用。考虑运算符^。您可以决定使用操作符重载将其转换为对power操作符的提升。但是,它只是具有错误的优先级和关联性。考虑到新的运算符无法添加,现有运算符的语义无法更改,术语“重载”中隐含的机制,运算符>>是按位右移运算符,其他一切都被理解为重载形式。克里斯B:我也不反对。也就是说,流的“”重载非常普遍,现在可以将它们单独称为流“运算符”。我这里唯一的观点是,我们不应该因为维克托使用了(显然)公认的术语而责骂他;请参阅我的Stroustrup链接。我已经提出了一个解决方案,该解决方案使用类似“cin>>ws”的内容跳过空白,并使用类似于静态bool match_string(std::istream&is,const char*str){size\t nstr=strlen(str);而(nstr){if(is.peek()=*str){is.ignore(1);++str;--nstr;}else{is.setstate(is.rdstate()| std::ios_base::failbit);返回false;}}返回true;}