【问题标题】:How to store data in boost::program_options::variable_map?如何在 boost::program_options::variable_map 中存储数据?
【发布时间】:2020-12-26 01:04:48
【问题描述】:

我目前正在尝试修改一些交给我的代码。代码的原点是读取配置文件,并在文件中设置不同的选项 boost::program_options::variable_map,然后在代码的其他部分中读取已经可以正常工作的部分。

这是我要替换的代码:

// 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::program_options::parsed_options parsedc 并自己创建这个对象。我遇到的问题只是没有关于如何执行此操作的文档。我认为这主要是因为它不是为这种方式设计的。

无论如何,我只是想用 dc 中描述的选项以及可以保存在单独数据结构(如向量)中的值来填充 vm 对象。

是否可以简单地向 vm 添加值?还是必须通过 boost::program_options::store() 之类的函数?

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

谢谢!

【问题讨论】:

    标签: c++ boost boost-program-options


    【解决方案1】:

    是的,你可以。

    请注意,您将不得不决定如何“模拟”/“伪造”它的其他语义。 (例如,您可能想将选项伪装成默认)

    从概念上讲,variable_map 将是一个map&lt;string, variable_value&gt;variable_value:

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

    还要注意,由于variable_value 使用boost::any 进行存储,因此您必须准确了解要存储的类型。 (因此,如果您需要 std::string("ah okay"),请不要存储 "oops")。

    这是一个简单的演示:

    Live On Coliru

    #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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-30
      • 2019-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多