1

文件 test.yaml .....

   ---
   map:
        ? [L, itsy] : ISO_LOW_ITSY(out, in, ctrl) 
        ? [L, bitsy] : ISO_LOW_BITSY(out, in, ctrl) 
        ? [L, spider] : ISO_LOW_SPIDER(out, in, ctrl) 
        ? [H, ANY] : ISO_HIGH(out, in, ctrl)

我可以使用什么命令通过 yaml-cpp 访问其中之一。我可以访问整个地图,但不能访问单个元素。

这是我正在尝试的:

    YAML::Node doc = YAML::LoadFile("test.yaml");
    std::cout << "A:" << doc["mapping"] << std::endl;
    std::cout << "LS1:" << doc["mapping"]["[L, spider]"] << std::endl;
    std::cout << "LS2:" << doc["mapping"]["L", "spider"] << std::endl;

这是我的结果:

    A:? ? - L
          - itsy
 : ISO_LOW_ITSY(out, in, ctrl)
: ~
? ? - L
    - bitsy
  : ISO_LOW_BITSY(out, in, ctrl)
: ~
? ? - L
    - spider
  : ISO_LOW_SPIDER(out, in, ctrl)
: ~
? ? - H
    - ANY
  : ISO_HIGH(out, in, ctrl)
: ~
LS1:
LS2:

如果这在 yaml-cpp 中还不可能,我也想知道。

4

1 回答 1

1

您必须定义与您的密钥匹配的类型。例如,如果您的键是两个标量的序列:

struct Key {
  std::string a, b;

  Key(std::string A="", std::string B=""): a(A), b(B) {}

  bool operator==(const Key& rhs) const {
    return a == rhs.a && b == rhs.b;
  }
};

namespace YAML {
  template<>
  struct convert<Key> {
    static Node encode(const Key& rhs) {
      Node node;
      node.push_back(rhs.a);
      node.push_back(rhs.b);
      return node;
    }

    static bool decode(const Node& node, Key& rhs) {
      if(!node.IsSequence() || node.size() != 2)
        return false;

      rhs.a = node[0].as<std::string>();
      rhs.b = node[1].as<std::string>();
      return true;
    }
  };
}

然后,如果您的 YAML 文件是

? [foo, bar]
: some value

你可以写:

YAML::Node doc = YAML::LoadFile("test.yaml");
std::cout << doc[Key("foo", "bar")];     // prints "some value"

笔记:

我认为您的 YAML 没有达到您的预期。在块上下文中,显式键/值对必须位于单独的行上。换句话说,你应该做

? [L, itsy]
: ISO_LOW_ITSY(out, in, ctrl)

不是

? [L, itsy] : ISO_LOW_ITSY(out, in, ctrl)

后者使其成为单个键,具有(隐式)空值;即,它与

? [L, itsy] : ISO_LOW_ITSY(out, in, ctrl)
: ~

(您可以通过 yaml-cpp 如何输出您的示例来查看这一点。)请参阅规范中的相关区域

于 2013-01-20T20:21:10.667 回答