C++ 如何在boost::program\u options::variable\u map中存储数据?

C++ 如何在boost::program\u options::variable\u map中存储数据?,c++,boost,boost-program-options,C++,Boost,Boost Program Options,我目前正试图重新编写一些传给我的代码。代码的原意是读取一个配置文件,并在boost::program\u options::variable\u映射中设置文件中的不同选项,然后在代码的其他部分读取这些选项,这些部分已经可以正常工作了 以下是我试图替换的代码: // Some helpful definitions boost::program_options::variables_map vm; std::string filecfg = "File_name"; std::

我目前正试图重新编写一些传给我的代码。代码的原意是读取一个配置文件,并在boost::program\u options::variable\u映射中设置文件中的不同选项,然后在代码的其他部分读取这些选项,这些部分已经可以正常工作了

以下是我试图替换的代码:

// Some helpful definitions
boost::program_options::variables_map vm;
std::string filecfg = "File_name";
std::ifstream ifs(filecfg.c_str());

// Setting options (This is command line example, but config file is the same)
boost::program_options::options_description df("Command Line");
df.add_options()
    ("help", "display help message")
    ("file-cfg,f", boost::program_options::value<std::string>(), "config file")
    ("version", "display version and revision number");

boost::program_options::parsed_options parsedc = boost::program_options::parse_config_file(ifs, df, true);
boost::program_options::store(parsedc, vm);
boost::program_options::notify(vm);
std::vector <std::string> unrc = boost::program_options::collect_unrecognized(parsedc.options, boost::program_options::include_positional)
//一些有用的定义
boost::程序选项::变量映射虚拟机;
std::string filecfg=“文件名”;
std::ifstream ifs(filecfg.c_str());
//设置选项(这是命令行示例,但配置文件相同)
boost::program_options::options_description df(“命令行”);
df.add_options()
(“帮助”,“显示帮助信息”)
(“文件cfg,f”,boost::program_options::value(),“配置文件”)
(“版本”、“显示版本和修订号”);
boost::program_uoptions::parsed\u options parsedc=boost::program\u options::parse\u config\u file(ifs,df,true);
boost::program_options::store(parsedc,vm);
boost::program_options::notify(vm);
std::vector unrc=boost::program\u options::collect\u无法识别(parsedc.options,boost::program\u options::include\u positional)
我的想法是简单地替换boost::program_options::parsed_options parsedc并自己创建这个对象。我遇到的问题很简单,就是没有关于如何做到这一点的文档。我认为这主要是因为它不是设计成这样使用的

在任何情况下,我只是希望用dc中描述的选项和可以保存在单独数据结构(如向量)中的值填充vm对象

是否可以简单地向vm添加值?或者我必须执行boost::program\u options::store()之类的函数吗

任何帮助都将不胜感激!如果有什么不清楚的地方,或者有什么你想让我试试的地方,请告诉我

谢谢

是的,你可以

请注意,您必须决定如何“模仿”/“伪造”它的其他语义。(例如,您可能希望将选项伪装为默认选项)

从概念上讲,变量映射应该是
映射

类别持有期权价值。包含有关如何设置值的详细信息 设置并允许方便地获取值

还要注意,因为
variable\u value
使用
boost::any
进行存储,所以您必须对要存储的类型进行精确的。(因此,如果需要
std::string(“啊好的”)
,就不要存储
“oops”

下面是一个简单的演示:

#include <boost/program_options.hpp>
#include <iostream>
#include <iomanip>

namespace po = boost::program_options;
using namespace std::string_literals;

int main(/*int argc, char** argv*/) {
    // Some helpful definitions
    po::variables_map vm;

    vm.emplace("file-cfg", po::variable_value("string"s, true));
    vm.emplace("log-level", po::variable_value(3, false));
    vm.emplace("option3", po::variable_value{});
    notify(vm);

    std::vector unrc = { "unrecognized"s, "options"s };

    for (auto& [name, value] : vm) {
        std::cout
            << "Name: " << name
            << std::boolalpha
            << "\tdefaulted:" << value.defaulted()
            << "\tempty:" << value.empty();

        if (typeid(std::string) == value.value().type())
            std::cout << " - string " << std::quoted(value.as<std::string>()) << "\n";
        else if (typeid(int) == value.value().type())
            std::cout << " - int " << value.as<int>() << "\n";
        else if (!value.empty())
            std::cout << " - unknown type\n";
    }
}
Name: file-cfg  defaulted:true  empty:false - string "string"
Name: log-level defaulted:false empty:false - int 3
Name: option3   defaulted:false empty:true