boost :: Program_options如何在值中支持哈希字符?

时间:2015-08-10 13:45:36

标签: c++ hash escaping boost-program-options

我正在尝试在配置文件的值中使用井号('#')。

我的用例是一个音乐程序,其中的值可以调整吉他乐谱。因此,支持'#'在值中是强制性的,并且不支持解决方法,不像平面,可以使用'来模拟。

我尝试了以下语法:

tuning.1=d#
tuning.1=d\#
tuning.1=d##

在所有这些情况下,键tuning.1都会收到值d,这当然不是意图。

是否可以在键的值中使用井号?我似乎无法在增强文档或在线中找到任何相关信息。或者我应该编写自定义解析器?

1 个答案:

答案 0 :(得分:1)

我认为您无法更改boost::program_options解析值的方式,因为文档says The # character introduces a comment that spans until the end of the line

但是,您可以使用boost::iostreams中的自定义过滤器在分析配置文件时将哈希字符转换为另一个哈希字符。请参阅有关filter usageinput 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);