【发布时间】:2020-03-14 12:40:09
【问题描述】:
这个问题涉及Boost::program_options 配置文件中值的解析。
我有一个简单的自定义数据结构:
struct Vector {
double x, y, z;
};
我有一个格式为“(x, y, z)”的 istream 反序列化器,这是我从另一个 SO 帖子中借来的:
// https://codereview.stackexchange.com/a/93811/186081
struct Expect {
char expected;
Expect(char expected) : expected(expected) {}
friend std::istream& operator>>(std::istream& is, Expect const& e) {
char actual;
if ((is >> actual) && (actual != e.expected)) {
is.setstate(std::ios::failbit);
}
return is;
}
};
template<typename CharT>
std::basic_istream<CharT> &
operator>>(std::basic_istream<CharT> &in, Vector &v) {
in >> Expect('(') >> v.x
>> Expect(',') >> v.y
>> Expect(',') >> v.z
>> Expect(')');
return in;
}
我正在使用Vector 的实例作为Boost::program_options 的值存储:
Vector vector {0.0, 0.0, 0.0};
po::options_description opts("Usage");
opts.add_options()
("vector", po::value(&vector), "The vector");
po::variables_map vm;
po::store(po::parse_config_file("config.cfg", opts, true), vm);
po::notify(vm);
问题是如果向量值表示包含空格,配置文件格式不起作用。例如,这个配置文件解析正确:
vector = (0.0,1.1,2.2)
但是,这个带有空格的,不解析:
vector = (0.0, 1.1, 2.2)
相反,program_options 抛出:
the argument ('(0.0, 1.1, 2.2)') for option 'vector' is invalid
但是,对于声明为 std::string 的选项,空格似乎没问题:
some_string = this is a string
我发现一些帖子提到使用引号,但这似乎不起作用(同样的错误):
vector = "(0.0, 1.1, 2.2)"
其他一些帖子建议使用自定义解析器,但我不确定如何实现这一点,而且处理几个空格似乎需要做很多工作。
我假设这种行为来自命令行选项的解析方式,即使这是配置文件解析。在这种情况下,像--vector (0.0, 1.1, 2.2) 这样的命令行没有多大意义(暂时忽略shell 保留字符( 和) 的使用)
有什么好的方法可以处理吗?
【问题讨论】:
标签: c++ config whitespace istream boost-program-options