【问题标题】:Boost custom validator for std::vector<double>增强 std::vector<double> 的自定义验证器
【发布时间】:2017-04-20 06:50:06
【问题描述】:

我为std::vector&lt;double&gt; 编写了以下自定义验证器。

typedef vector<double> coordinate;
void validate(boost::any& v,
  const vector<string>& values,
  coordinate*, int) {
  std::cout << "Custom validator called\n";
  coordinate c;
  vector<double> dvalues;
  for(vector<string>::const_iterator it = values.begin();
    it != values.end();
    ++it) {
    stringstream ss(*it);
    copy(istream_iterator<double>(ss), istream_iterator<double>(),
      back_inserter(dvalues));
    if(!ss.eof()) {
      std::cerr << "SS EOF\n";
      throw po::invalid_option_value("Invalid coordinate specification sseof");
    }
  }
  if(dvalues.size() != 2) {
    std::cerr << "dvalues size\n";
    throw po::invalid_option_value("Invalid coordinate specification dvalues size");
  }
  c.push_back(dvalues[0]);
  c.push_back(dvalues[1]);
  v = c;
}

我以以下方式添加选项:

coordinate c;
// Setup options.
po::options_description desc("Options");
desc.add_options()
  ("instruments.prop", po::value<coordinate>( &c )->multitoken(),
   "plugin names" );

程序根本没有使用自定义验证器。如果正在使用我的验证器,我没有收到应该打印的消息“调用自定义验证器”。相反,我得到了这个错误:

在抛出一个实例后调用终止 'boost::exception_detail::clone_impl

'what(): 选项'instruments.name' 的参数('1 2.9')无效 Aborted (core dumped)

我的配置文件如下所示:

[仪器]
道具= 1 2.9

关于如何解析配置文件中的多个参数而不将它们写在单独的行中的任何想法,如下所示:

[仪器]
道具 = 1
道具 = 2.9

【问题讨论】:

    标签: c++ validation c++11 boost


    【解决方案1】:

    您应该编写自定义转换:

    Live On Coliru

    #include <boost/program_options.hpp>
    #include <boost/algorithm/string/split.hpp>
    #include <boost/algorithm/string/classification.hpp>
    #include <fstream>
    #include <iostream>
    
    namespace po = boost::program_options;
    typedef std::vector<double> coordinate;
    
    int main() {
        coordinate c;
    
        // Setup options.
        po::options_description desc("Options");
        desc.add_options()
            ("instruments.prop", po::value<std::string>()->multitoken()->notifier([&c](std::string const& v) {
                 auto it = boost::make_split_iterator(v, boost::token_finder(boost::algorithm::is_any_of(" ,")));
                 std::transform(it, {}, back_inserter(c), [](auto& s) {
                            return boost::lexical_cast<double>(s);
                         });
             }),
             "plugin names" );
    
        std::ifstream ifs("input.txt");
        po::variables_map vm;
        store(po::parse_config_file(ifs, desc, false), vm);
        po::notify(vm);
    
        std::copy(c.begin(), c.end(), std::ostream_iterator<double>(std::cout << "c: ", " "));
        std::cout << "\n";
    }
    

    打印

    c: 1 2.9
    

    【讨论】:

      猜你喜欢
      • 2020-01-25
      • 1970-01-01
      • 2012-08-07
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-16
      • 1970-01-01
      相关资源
      最近更新 更多