gpt4 book ai didi

c++ - 如何在boost::program_options::variable_map中存储数据?

转载 作者:行者123 更新时间:2023-12-02 10:10:35 25 4
gpt4 key购买 nike

我目前正在尝试重做一些传递给我的代码。代码的原始点是读取配置文件,并在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中描述的选项以及可以保存在单独的数据结构(如 vector )中的值填充vm对象。
是否可以简单地将值添加到vm?还是我必须通过boost::program_options::store()之类的函数?
任何帮助将不胜感激!让我知道不清楚的地方,或者您想让我尝试一下!
谢谢!

最佳答案

是的,你可以。
请注意,尽管如此,您将不得不决定如何“模拟” /“伪造”它的其他语义。 (例如,您可能想将这些选项伪装成默认选项)
从概念上讲,variable_map将是map<string, variable_value> variable_value :

Class holding value of option. Contains details about how the value isset and allows to conveniently obtain the value.


还要注意,由于 variable_value使用 boost::any进行存储,因此您必须对要存储的类型精确地使用 。 (因此,如果需要 "oops",请不要存储 std::string("ah okay"))。
这是一个简单的演示:
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

关于c++ - 如何在boost::program_options::variable_map中存储数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63780447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com