通过索引操作员插入boost :: program_options :: variables_map



我有一个 boost::program_options::variables_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>());

,但有时会从命令行给出空输入。因此,如果它们是空的,那么我必须在po :: variables_map中更新它们

该库旨在从命令行解析后或从文件中存储参数。您不能直接使用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;
}

如果您只想在缺失某些键的值中插入一个值,则只需使用boost::program_options的文档中所述的default_value选项。

例如:

  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。

这是令人讨厌的。

找到了在 variables_map中设置值的另一种方法:只是致电"父"。运算符的方法[]

这样:

namespace po = boost::program_options;
po::variables_map my_map;
std::string my_val = "smth";
boost::any my_val_any;
my_val_any = 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_any;

最新更新