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

问题描述 投票:0回答:3

我有一个

boost::program_options::variables_map
参数。现在我想像键值对一样手动插入到这个映射中。 示例:

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::variables_map args 本身内部更新它们

c++ boost boost-program-options
3个回答
3
投票

该库旨在存储从命令行或文件解析后的参数。您不能像

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
选项,如 boost::program_options
documentation
中所述。

例如:

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

1
投票

由于它公开继承自

std::map<std::string, variable_value>
,因此将其强制转换为
std::map
并按如下方式使用应该相对安全:

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

不能保证这足以让

variable_map
使用它,但目前似乎是:cpph

这是需要的,这很烦人。


0
投票

variables_map
中找到另一种设置值的方法:只需调用operator[]的“父”方法

像这样:

namespace po = boost::program_options;

po::variables_map my_map;

std::string my_val = "smth";
po::variable_value my_val_variable = boost::any_cast<po::variable_value>(my_val);

my_map.std::map< std::string, po::variable_value >::operator[]( "key" ).value() = "value"; //or:
my_map.std::map< std::string, po::variable_value >::operator[]( "key" ).value() = my_val_variable;
© www.soinside.com 2019 - 2024. All rights reserved.