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);