提升标准::矢量<double>的自定义验证器

Boost custom validator for std::vector<double>

本文关键字:验证 自定义 gt lt 标准 矢量 double      更新时间:2023-10-16

我为std::vector<double>编写了以下自定义验证器。

typedef vector<double> coordinate;
void validate(boost::any& v,
  const vector<string>& values,
  coordinate*, int) {
  std::cout << "Custom validator calledn";
  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 EOFn";
      throw po::invalid_option_value("Invalid coordinate specification sseof");
    }
  }
  if(dvalues.size() != 2) {
    std::cerr << "dvalues sizen";
    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'(被无效中止(核心倾倒(

我的配置文件看起来像:

[仪器]
prop = 1 2.9

关于如何从配置文件中解析多个参数的任何想法,而无需在这样的单独行中编写它们:

[仪器]
prop = 1
prop = 2.9

您要编写自定义转换:

活在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