是否可以在 yaml-cpp 中设置发射器缩进的基本级别?
Posted
技术标签:
【中文标题】是否可以在 yaml-cpp 中设置发射器缩进的基本级别?【英文标题】:Is it possible set the base level of Emitter indentation in yaml-cpp? 【发布时间】:2020-09-02 22:41:34 【问题描述】:是否有一种一次性的方法可以为 Emitter
在 yaml-cpp 中发出的所有值设置基本缩进级别?
我尝试使用 Emitter::SetIndent
和 Emitter::SetLocalIndent
但它们似乎只影响发射器根级别以下的项目,而不是根级别项目本身
为了说明,请考虑以下所需 YAML 输出。值开始时已经缩进了 4 个空格(我右边的 cmets 不是输出的一部分)
type: Circle // Correctly indented by 1 level (4 spaces)
r: 492.763875219
x: 1286.75555556
y: 1195.04
regions:
- id: 1750272850 // Correctly indented by 2 levels (8 spaces)
width: 200
- id: 524770566
width: 42
我试着用这段代码写出来:
void Shape::writeToYaml(std::ostream& os)
YAML::Emitter out;
out.SetIndent(4); // THIS DOES NOT HELP
out << YAML::BeginMap;
for (auto&& prop : properties()) // 'properties()' returns std::map<string, string>
out << YAML::Key << prop.first << YAML::Value << prop.second;
out << YAML::Key << PK_REGIONS << YAML::Value;
out << YAML::BeginSeq;
for (auto&& region : m_regions)
out << region.properties(); // 'properties()' returns std::map<string, string>
out << YAML::EndSeq;
out << YAML::EndMap;
os << out.c_str();
相反,我得到了这个输出,其中根值根本没有缩进,而低于这些值的值缩进太多
type: Circle // WRONG: NOT INDENTED AT ALL
r: 492.763875219
x: 1286.75555556
y: 1195.04
regions:
- id: 2077164443 // WRONG: INDENTED BY TOO MUCH
width: 200
- id: 2031385931
width: 42
(我正在尝试调整现有的 yaml 编写代码而不在我的 API 中公开 yaml-cpp 类型,因此我需要能够动态创建发射器,然后设置它们的基本缩进。我正在使用最新,0.6 版本,昨天下载)
【问题讨论】:
【参考方案1】:afaik yaml-cpp 无法为您执行此操作,但解决方法非常简单:
std::stringstream ss(out.c_str());
std::string line;
while (std::getline(line, ss))
os << " " << line << std::endl;
为避免复制发射器的输出字符串,see here。
【讨论】:
以上是关于是否可以在 yaml-cpp 中设置发射器缩进的基本级别?的主要内容,如果未能解决你的问题,请参考以下文章