通过索引运算符插入boost :: program_options :: variables_map

时间:2019-05-09 09:24:32

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

我有一个boost::program_options::variables_map参数。现在,我想像键值对一样手动插入此地图。 示例:

boost::program_options::variables_map args

args["document"] = "A";

args["flag"] = true;

问题是我已经有这两个选项

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

,但是有时会从命令行为它们提供空输入。因此,如果它们为空,那么我必须在po :: variables_map args本身内部对其进行更新

2 个答案:

答案 0 :(得分:1)

该库旨在在从命令行或文件解析后存储参数。您不能直接使用operator[]来分配类似std::map的值,因为它会返回const引用,请参见注释here

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的{​​{3}}中所述使用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));

答案 1 :(得分:0)

由于它公开地继承自std::map<std::string, variable_value>,因此将其强制转换为std::map并这样使用应该相对安全:

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

无法保证足以使variable_map使用它,但是目前看来是:cpph

这很烦人。