促进。方便的variables_map。利用在options_desctription

时间:2015-08-08 09:53:30

标签: c++ dictionary boost

在c ++中使用boost/program_options,当我构建options_description时,我指定了每个选项的类型(在这种情况下为fs::path):

namespace fs = boost::filesystem;
namespace po = boost::program_options;

po::options_description desc("Example");
desc.add_options()
  ("help", "Print help messages")
  ("input,i", po::value<fs::path>(), "Input folder");

我构建了variables_map

po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);

当我访问该选项时,我必须再次指定其类型:

vm["input"].as<fs::path>()

而不是

vm["input"]

是否有更方便的访问变量映射的方法? 我已经指定了存储在variable_value中的vm类型

这一事实无法提升利用率

我看到许多程序员最终将选项存储在另一个变量

fs::path input = vm["input"].as<fs::path>()

但我想避免定义冗余变量。

1 个答案:

答案 0 :(得分:1)

您可以在此处使用Storage component of the library中的notify功能。

<强> Live On Coliru

#include <iostream>
#include <fstream>
#include <boost/program_options.hpp>
#include <boost/filesystem.hpp>

namespace po = boost::program_options;

int main(int argc, char** argv) {
    namespace fs = boost::filesystem;
    namespace po = boost::program_options;

    po::options_description desc("Example");

    int i = -99; // some value
    fs::path v;  // the only place where we ever specify the type!

    desc.add_options()
      ("help", "Print help messages")
      ("value,v", po::value(&i)->default_value(42),          "Input folder")
      ("input,i", po::value(&v)->default_value("TheAnswer"), "Input folder");

    po::variables_map vm;
    po::store(po::parse_command_line(argc, argv, desc), vm);
    notify(vm);

    std::cout << i << ", " << v << "\n";
}

这里的转换以及类型规范本身是隐含的。输出:

./test
42, "TheAnswer"

./test -i /temp/path/foo --value=123
123, "/temp/path/foo"