0

スカラーをブールとして解析したい。この例は機能します:

#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=..., value=@0x63f6e8) at /usr/include/yaml-cpp/nodeimpl.h:24

そして、文字列が「はい」または「いいえ」でない場合、「YAML::InvalidScalar」を取得します。

4

1 に答える 1

0

yaml-cppboolは、YAML 仕様で指定されているように、デフォルトで s を既に読み取ります。

y、はい、真、オン

を生成trueし、

いいえ、いいえ、偽、オフ

生産するfalse。この動作を拡張または変更したい場合 (たとえば、「да」も を生成するように)、名前空間でのtrueオーバーロードが機能することがわかりました。operator >>YAML

名前空間にある必要がある理由(ただし、「より複雑な例」の場合のみ - 引数を使用してYAML直接呼び出さない場合) は、C++ ルックアップが機能する方法です。operator >>bool

すばらしい説明については、私の古い質問に対するこの回答を参照してください。

于 2011-09-07T16:57:29.813 に答える