C++ 插入boost::程序\选项::变量\按索引运算符映射

C++ 插入boost::程序\选项::变量\按索引运算符映射,c++,boost,boost-program-options,C++,Boost,Boost Program Options,我有一个boost::program\u options::variables\u mapargs。现在我想像键值对一样手动插入到这个映射中。 例如: boost::program_options::variables_map args args["document"] = "A"; args["flag"] = true; 问题是我已经有了这两种选择 desc.add_options() ("document", po::value<std::string>())

我有一个
boost::program\u options::variables\u map
args。现在我想像键值对一样手动插入到这个映射中。 例如:

boost::program_options::variables_map args

args["document"] = "A";

args["flag"] = true;

问题是我已经有了这两种选择

desc.add_options()
    ("document", po::value<std::string>())
    ("flag", po::value<bool>());
desc.添加选项()
(“文档”,po::value())
(“标志”,po::value());

但有时从命令行向它们提供空输入。因此,如果它们是空的,那么我必须在po::variables\u map args本身中更新它们。

库设计用于在从命令行或文件解析后存储参数。您不能直接使用
运算符[]
std::map
那样赋值,因为它返回一个
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;
}

由于它公开继承自
std::map
,因此将其强制转换为
std::map
并按如下方式使用应该是相对安全的:

(*static_cast<std::map<std::string, variable_value>*>(my_variable_map))[name] = value;
(*static_cast(my_variable_map))[name]=值;
无法保证这足以让
变量映射使用它,但目前似乎是:


需要这样做很烦人。

因为C++11,您可以使用std::map的at()直接访问和编辑键。@Simon是的,但如果元素不存在,它会引发异常。这里的问题是如何在地图中添加元素。哦,请忘记我的评论。对不起,我误读了这个问题,因为我昨天遇到了一个类似的问题。问题是我已经有了这两个选项desc.add_options()(“document”,po::value())(“flag”,po::value());但有时命令行会给它们提供空输入,所以如果它们是空的,那么我必须在po::variables\u map args中更新它们itself@etotientz在这种情况下,只需使用
默认值
选项,请参阅展开答案。
  po::options_description desc("");
  desc.add_options()
    ("document", po::value<std::string>()->default_value("default_document")
    ("flag", po::value<bool>()->default_value(false));
(*static_cast<std::map<std::string, variable_value>*>(my_variable_map))[name] = value;