我正在将 yaml-cpp 与 C++11 一起使用。我可以使用这样简单的东西创建一个 YAML 文件:
#include <yaml-cpp/yaml.h>
#include <iostream>
int main(void)
{
YAML::Node topNode;
topNode["one"]["two"]["A"] = "foo";
topNode["one"]["two"]["B"] = 42;
std::cout << "%YAML 1.2\n---\n" << topNode;
return 0;
}
这将生成一个如下所示的 YAML 文件:
%YAML 1.2
---
one:
two:
A: foo
B: 42
可爱!
我还可以生成完全相同的 YAML 文件,如下所示:
#include <yaml-cpp/yaml.h>
#include <iostream>
int main(void)
{
YAML::Emitter out;
out << YAML::BeginMap // document {
<< "one"
<< YAML::BeginMap // one {
<< "two"
<< YAML::BeginMap // two {
<< YAML::Key << "A" << YAML::Value << "foo"
<< YAML::Key << "B" << YAML::Value << 42
<< YAML::EndMap // two }
<< YAML::EndMap // one }
<< YAML::EndMap // document }
;
std::cout << "%YAML 1.2\n---\n"
<< out.c_str();
return 0;
}
第二种方法的好处是我还可以在输出文件中添加注释:
#include <yaml-cpp/yaml.h>
#include <iostream>
int main(void)
{
YAML::Emitter out;
out << YAML::BeginMap // document {
<< "one"
<< YAML::BeginMap // one {
<< "two"
<< YAML::BeginMap // two {
<< YAML::Key << "A" << YAML::Value << "foo"
<< YAML::Comment("A should be 'foo'")
<< YAML::Key << "B" << YAML::Value << 42
<< YAML::Comment("B is meaningful")
<< YAML::EndMap // two }
<< YAML::EndMap // one }
<< YAML::EndMap // document }
;
std::cout << "%YAML 1.2\n---\n"
<< out.c_str();
return 0;
}
生产:
%YAML 1.2
---
one:
two:
A: foo # A should be 'foo'
B: 42 # B is meaningful
我的问题是否有办法在第一种方法中添加注释?也许是这样的:
topNode["one"]["two"]["A"] = "foo";
topNode["one"]["two"]["A"].addComment("A should be 'foo'");
我可以子类
YAML::Node
,添加我的 addComment()
方法,但我不想重写所有 YAML::Emitter
来适当地附加我的评论。代码在那里,但我不知道如何获取它。如何?你能给我举个例子或方法吗?
我了解 YAML 规范规定注释不是 YAML 文件的组成部分,可以丢弃。我的用户发现它们很有用,所以我不喜欢以“你的问题很愚蠢”开头的辩论。 :-)
当前的 API 无法做到这一点。发射器使用 EventHandler,如您所见,它无法发出注释。
创建事件的Emit函数也不会通过其他方式创建任何评论事件。
由于
operator<<
上的 Node
将在内部使用 Emitter 类,因此无法通过将注释添加到节点来发出注释,除非您自己重写发射器。
如果你想考虑另一个库,由于缺乏其他广泛使用的库的支持,mrpt-containers 确实实现了这样一个处理注释的功能。
请参阅如何添加注释的 C++ 示例此处:
// You can use {} to initialize mappings (dictionaries):
using mrpt::containers::CommentPosition;
using mrpt::containers::vcp; // value-comment-position
using mrpt::containers::vkcp; // value-key-comment-position
mrpt::containers::yaml p;
// Insert a key in a map with a "comment" block.
p << vkcp("L", 5.5, "Arm length [meters]")
<< vkcp("D", 1.0, "Distance [meters]") << vkcp("Y", -5, "Comment for Y");
或者如何解析评论这里:
// Get comments:
std::cout << "Comment: '" << p["myMap"]["nestedMap"]["a"].comment()
<< "'\n";
该库可以安装在基于 Debian 的系统中:
sudo apt install libmrpt-containers-dev
(免责声明:我是项目上游维护者)