在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>()
但我想避免定义冗余变量。
答案 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"