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

Insert into boost::program_options::variables_map by index operator

我有一个 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 本身

中更新它们

该库旨在存储从命令行或文件解析后的参数。您不能直接使用 operator[]std::map 那样赋值,因为它 returns 是 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 选项,如 boost::program_optionsdocumentation 中所述。

例如:

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

由于它公开继承自 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.

很烦人需要这个。