boost::Program_options 如何在值中支持散列字符?
boost::Program_options How to support hash character in a value?
我正在尝试在配置文件的值中加入井号 ('#')。
我的用例是一个音乐程序,其中的值给出了吉他乐谱的调音。因此,在值中支持“#”是强制性的,并且不支持任何解决方法,这与可以使用 'b'.
模拟的平面不同。
我试过以下语法:
tuning.1=d#
tuning.1=d\#
tuning.1=d##
在所有这些情况下,键 tuning.1
接收值 d
,这当然不是本意。
是否可以在键的值中加入井号?我似乎无法在 boost 文档或在线上找到任何相关信息。或者我应该求助于编写自定义解析器?
我认为您无法更改 boost::program_options
解析值的方式,因为文档 says The # character introduces a comment that spans until the end of the line
.
但是,在解析配置文件时,您可以使用 boost::iostreams
中的自定义过滤器将哈希字符转换为另一个哈希字符。请参阅有关 filter usage and input filters 的文档。这是我写的一个非常基本的,用 @
:
替换 #
#include <boost/iostreams/filtering_stream.hpp>
struct escape_hash_filter: public boost::iostreams::input_filter
{
template <typename Source>
int get (Source& src)
{
int c = boost::iostreams::get (src);
if ((c == EOF) or (c == boost::iostreams::WOULD_BLOCK))
return c;
return ((c == '#')? '@': c;
}
};
使用示例:
std::ifstream in {"example.cfg"};
boost::iostreams::filtering_istream escaped_in;
escaped_in.push (escape_hash_filter {});
escaped_in.push (in);
po::store (po::parse_config_file (escaped_in, desc), vm);
我正在尝试在配置文件的值中加入井号 ('#')。
我的用例是一个音乐程序,其中的值给出了吉他乐谱的调音。因此,在值中支持“#”是强制性的,并且不支持任何解决方法,这与可以使用 'b'.
模拟的平面不同。我试过以下语法:
tuning.1=d#
tuning.1=d\#
tuning.1=d##
在所有这些情况下,键 tuning.1
接收值 d
,这当然不是本意。
是否可以在键的值中加入井号?我似乎无法在 boost 文档或在线上找到任何相关信息。或者我应该求助于编写自定义解析器?
我认为您无法更改 boost::program_options
解析值的方式,因为文档 says The # character introduces a comment that spans until the end of the line
.
但是,在解析配置文件时,您可以使用 boost::iostreams
中的自定义过滤器将哈希字符转换为另一个哈希字符。请参阅有关 filter usage and input filters 的文档。这是我写的一个非常基本的,用 @
:
#
#include <boost/iostreams/filtering_stream.hpp>
struct escape_hash_filter: public boost::iostreams::input_filter
{
template <typename Source>
int get (Source& src)
{
int c = boost::iostreams::get (src);
if ((c == EOF) or (c == boost::iostreams::WOULD_BLOCK))
return c;
return ((c == '#')? '@': c;
}
};
使用示例:
std::ifstream in {"example.cfg"};
boost::iostreams::filtering_istream escaped_in;
escaped_in.push (escape_hash_filter {});
escaped_in.push (in);
po::store (po::parse_config_file (escaped_in, desc), vm);