Вставить в boost :: program_options :: variable_map с помощью оператора index - PullRequest
4 голосов
/ 09 мая 2019

У меня есть boost::program_options::variables_map args. Теперь я хочу вставить в эту карту вручную, как пара ключ-значение. Пример:

boost::program_options::variables_map args

args["document"] = "A";

args["flag"] = true;

Проблема в том, что у меня уже есть эти 2 варианта

desc.add_options()
    ("document", po::value<std::string>())
    ("flag", po::value<bool>());

но им иногда дают пустой ввод из командной строки. Поэтому, если они пусты, я должен обновить их внутри самих аргументов po :: variable_map

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Библиотека предназначена для хранения аргументов после синтаксического анализа из командной строки или из файла.Вы не можете напрямую использовать operator[] для назначения значений, таких как std::map, потому что он возвращает ссылку const, см. Аннотацию здесь :

const variable_value & operator[](const std::string &) const;

Если вы действительно действительно хотите вручную назначить значения ключей, вы можете создать std::stringstream и проанализировать его с библиотекой, см. следующий пример программы

#include <string>
#include <sstream>
#include <iostream>
#include <boost/program_options/options_description.hpp>
#include <boost/program_options/parsers.hpp>
#include <boost/program_options/variables_map.hpp>

int main()
{
  namespace po = boost::program_options;

  std::stringstream s;
  s << "document=A" << std::endl << "flag=true" << std::endl;

  po::options_description desc("");
  desc.add_options()
    ("document", po::value<std::string>())
    ("flag", po::value<bool>());

  po::variables_map vm;
  po::store(po::parse_config_file(s, desc, true), vm);
  po::notify(vm);

  std::cout << "document is: " << vm["document"].as<std::string>() << std::endl;
  std::cout << "flag is: " << (vm["flag"].as<bool>() ? "true" : "false") << std::endl;

  return 0;
}

Если вы вместо этогопросто хотите вставить значение для некоторых ключей, когда они отсутствуют, вы можете просто использовать опции default_value, как описано в документации из boost::program_options.

Например:

  po::options_description desc("");
  desc.add_options()
    ("document", po::value<std::string>()->default_value("default_document")
    ("flag", po::value<bool>()->default_value(false));
0 голосов
/ 30 мая 2019

Так как он публично наследует от std::map<std::string, variable_value>, относительно безопасно безопасно привести его к std::map и использовать как таковой:

(*static_cast<std::map<std::string, variable_value>*>(my_variable_map))[name] = value;

Нет гарантии, что этого достаточно, чтобы variable_map использовал его, но в настоящее время оно выглядит так: cpp , h .

Раздражает, что это необходимо.

...