gpt4 book ai didi

c++ - 更改 boost::property_tree 读取将字符串转换为 bool 值的方式

转载 作者:IT老高 更新时间:2023-10-28 22:36:01 25 4
gpt4 key购买 nike

我迷失在 boost property_tree 的头文件中,并且由于缺乏关于较低层的文档,我决定询问有什么简单的方法可以覆盖流转换器以更改 bool 值的方式被解析。

问题是在属性树的输入端,有用户,他们可以修改配置文件。可以通过多种方式指定 bool 值,例如:

dosomething.enabled=true
dosomething.enabled=trUE
dosomething.enabled=yes
dosomething.enabled=ON
dosomething.enabled=1

默认行为是检查 0 或 1,然后使用

std::ios_base::boolalpha 

让流尝试以适合当前语言环境的方式解析值...如果我们尝试将配置文件发送给国际客户,这可能会很疯狂。

那么,什么是最简单的方法来覆盖此行为或仅使用 bool?不仅最容易实现,而且最容易使用——因此我的类的用户从 iptree 派生不需要为 bool 值做一些特殊的事情。

谢谢!

最佳答案

您可以专门化 boost::property_tree::translator_between 以便属性树将自定义转换器用于 bool 值类型。想要定制行为的客户必须可以看到这种特化(即#included)。这是一个工作示例:

#include <iostream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/algorithm/string/predicate.hpp>

// Custom translator for bool (only supports std::string)
struct BoolTranslator
{
typedef std::string internal_type;
typedef bool external_type;

// Converts a string to bool
boost::optional<external_type> get_value(const internal_type& str)
{
if (!str.empty())
{
using boost::algorithm::iequals;

if (iequals(str, "true") || iequals(str, "yes") || str == "1")
return boost::optional<external_type>(true);
else
return boost::optional<external_type>(false);
}
else
return boost::optional<external_type>(boost::none);
}

// Converts a bool to string
boost::optional<internal_type> put_value(const external_type& b)
{
return boost::optional<internal_type>(b ? "true" : "false");
}
};

/* Specialize translator_between so that it uses our custom translator for
bool value types. Specialization must be in boost::property_tree
namespace. */
namespace boost {
namespace property_tree {

template<typename Ch, typename Traits, typename Alloc>
struct translator_between<std::basic_string< Ch, Traits, Alloc >, bool>
{
typedef BoolTranslator type;
};

} // namespace property_tree
} // namespace boost

int main()
{
boost::property_tree::iptree pt;

read_json("test.json", pt);
int i = pt.get<int>("number");
int b = pt.get<bool>("enabled");
std::cout << "i=" << i << " b=" << b << "\n";
}

test.json:

{
"number" : 42,
"enabled" : "Yes"
}

输出:

i=42 b=1

请注意,此示例假定属性树不区分大小写并使用 std::string。如果您希望 BoolTranslator 更通用,则必须将 BoolTranslator 设为模板,并为宽字符串和区分大小写的比较提供专门化。

关于c++ - 更改 boost::property_tree 读取将字符串转换为 bool 值的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9745716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com