c++ yaml-cpp不使用本地标记进行往返

u7up0aaq  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(219)

当I YAML::Load具有本地标记的节点时,不保留标记类型和标记内容。

最小示例

我使用的是0.7.0版的conan软件包。

auto x = YAML::Node(42);

YAML::Emitter e;
e << YAML::LocalTag("x") << x;
std::string s = e.c_str();
auto y = YAML::Load(s);

std::cout << "before: " << s << std::endl;
std::cout << "tag:    " << y.Tag() << std::endl;
std::cout << "after:  " << YAML::Dump(y) << std::endl;

印刷品

before: !x 42
tag:    !x
after:  !<!x> 42

预期值:

before: !x 42
tag:    x
after:  !x 42

我想这里有两件事出了问题:
1.前导感叹号将添加到标记内容中
1.标记类型从_Tag::Type::PrimaryHandle更改为_Tag::Type::Verbatim
所以我有两个问题:
1.这是一个bug还是我做错了?* 我不能100%确定我正确理解了复杂的yaml标签规范...*
1.是否有办法为现有节点设置_Tag::Type作为解决方法?

**注意:**我已经将此问题作为Github issue发布。请原谅冗余。

7uhlpewt

7uhlpewt1#

您的问题在于此代码:

void EmitFromEvents::EmitProps(const std::string& tag, anchor_t anchor) {
  if (!tag.empty() && tag != "?" && tag != "!")
    m_emitter << VerbatimTag(tag);
  if (anchor)
    m_emitter << Anchor(ToString(anchor));
}

主要的问题是默认的发射器总是产生逐字的标签,次要的问题是节点不记得标签样式。
要回答问题 * 这是否是一个错误 *:不。YAML规范不保证任何形式的往返。只要输出的语义是正确的,实现就可以以任何样式发出YAML。
若要回答是否有可能的解决方法的问题:不使用现有的发射器--正如你所看到的,没有可设置的选项来修改这个行为。我不完全确定API是否提供了足够的内部访问权限来轻松地适应现有的发射器。
在任何情况下,这将是太复杂的SO答案。

相关问题