use*_*710 6 c++ boost boost-program-options c++11
po::options_description desc("This are the options that are available");
desc.add_options()("help", "print help")(
"deer", po::value<uint32_t>(), "set how many deer you want")(
"rating", po::value<uint32_t>(), "how good ?")(
"name", po::value<std::string>(), "and your name is ... ?");
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
Run Code Online (Sandbox Code Playgroud)
在我试图迭代的代码的以下部分 vm
for (const auto& it : vm) {
std::cout << it.first.c_str() << " "
<< it.second.as<it.pair::second_type>() << "\n";
}
Run Code Online (Sandbox Code Playgroud)
这里的要点是vm
包含keys
相同类型,但是具有不同类型的值,在这个例子中我uint32_t
混合了一个std::string
.
我如何迭代这种容器?我想避免冗长的方法,所以我试图迭代这个数据结构.
编辑:
我忘了把它写下来,但很明显
namespace po = boost::program_options;
Run Code Online (Sandbox Code Playgroud)
yng*_*ccc 13
提升variable_map
使用boost::any
作为值,以便您可以尝试使用boost::any_cast<T>
以找出类型.也许是这样的
for (const auto& it : vm) {
std::cout << it.first.c_str() << " ";
auto& value = it.second.value();
if (auto v = boost::any_cast<uint32_t>(&value))
std::cout << *v;
else if (auto v = boost::any_cast<std::string>(&value))
std::cout << *v;
else
std::cout << "error";
}
Run Code Online (Sandbox Code Playgroud)
boost::program_options::variable_map
本质上是 an std::map<std::string, boost::any>
,这意味着它使用类型擦除来存储值。因为原始类型丢失了,所以如果不将其转换为正确的类型,就无法提取它。您可以实现一个map
包含选项名称作为键和提取函数作为值的第二个,允许您在运行时将值分派到适当的提取器。
using extractor = std::map<std::string, void(*)(boost::variable_value const&)>;
Run Code Online (Sandbox Code Playgroud)
或者
using extractor = std::map<std::string,
std::function<void(boost::variable_value const&)>;
Run Code Online (Sandbox Code Playgroud)
如果您的提取器更复杂并且不会转换为简单的函数指针。将打印 a 的提取器的示例uint32_t
是
auto extract_uint32_t = [](boost::variable_value const& v) {
std::cout << v.as<std::uint32_t>();
};
Run Code Online (Sandbox Code Playgroud)
然后你的循环看起来像这样:
for (const auto& it : vm) {
std::cout << it.first.c_str() << " "
extractor_obj[it.first](it.second)
std::cout << "\n";
}
Run Code Online (Sandbox Code Playgroud)
这是一个包含一些组合类型的实时演示,但它与您的用例非常接近,您应该能够应用类似的东西。
归档时间: |
|
查看次数: |
6687 次 |
最近记录: |