2011-09-07 114 views
0

我想将标量解析为bool。 这个例子的工作原理:如何重载operator >> for bool

#include <yaml.h> 
#include <iostream> 
#include <sstream> 
#include <string> 

void operator>> (const YAML::Node & node, bool & b) 
{ 
    std::string tmp; 
    node >> tmp; 
    std::cout << tmp << std::endl; 
    b = (tmp == "1") || (tmp == "yes"); 
} 

int main() 
{ 
    bool b1, b2; 
    std::stringstream ss("key: да\notherkey: no"); 
    YAML::Parser parser(ss); 
    YAML::Node doc; 
    parser.GetNextDocument(doc); 

    doc["key"] >> b1; 
    doc["otherkey"] >> b2; 

    std::cout << b1 << std::endl; 
    std::cout << b2 << std::endl; 

    return 0; 
} 

但在更复杂的情况下,运营商的模板使用:

YAML::operator>><bool> (node=..., [email protected]) at /usr/include/yaml-cpp/nodeimpl.h:24 

而且我不“是”或“没有”得到“YAML :: InvalidScalar”如果字符串。

+0

哇。我在命名空间YAML {}中包围了我的重载运算符。现在它可以工作... – Igor

回答

0

YAML-CPP已经默认读取bool S,由YAML规范规定。

Y,是的,真正的,对

产生true

N,没有,假的,关

产生false。如果要扩展或更改此行为(例如,使“да”也生成true),如您所知,在YAML命名空间中重载operator >>工作。

它需要在YAML名称空间中的原因是(但仅限于“更复杂的示例” - 意思是您不直接使用bool参数调用operator >>)是C++查找的工作方式。

一个伟大的说明,请参见this answermy old question

+0

谢谢。我只想要一个本地化的版本,例如。 G。 “да”用俄语 – Igor