如何使用boost :: program_options解析自身包含开关的命令行参数?

时间:2012-04-19 11:54:58

标签: c++ boost-program-options

我正在用C ++编写一个程序,它是一些基准测试的包装器,它包含一些开头的设置代码和最终的analisys代码。

我想并行运行两个基准测试。这些的原始命令行是:

/path0/benchmark0 -switch0 -switch1 -switch2
/path1/benchmark1 -arg0 -arg1 -arg2 -arg4

我想把它们放在我的包装器的命令行上:

wrapper -setup_arg0 -setup_arg1 -analysis_arg0 --command0 /path0/benchmark0 -switch0 -switch1 -switch2 --command1 /path1/benchmark1 -arg0 -arg1 -arg2 -arg4

我希望获得两个std::vector<std::string>,每个command0command1一个,包含原始命令行。我正在这样做(使用boost::program_options):

("command0", po::value<std::vector< std::string> >(&command0)->multitoken(), "command line for thread 0")
("command1", po::value<std::vector< std::string> >(&command1)->multitoken(), "command line for thread 1")

这基本上有效。但是,如果基准测试的参数以-开头(就像我见过的大多数程序中的大多数开关那样),program_options会尝试将它们解析为包装器开关的一部分,因为它不知道它们应该在command0command1下组合在一起。

program_options支持吗?如果是这样,怎么样?


示例:

我工作的地方有一个约定,通过“终止”多重语音这样做:

wrapper <snip> --command0 /path0/benchmark0 -switch0 -switch1 -switch2 -command0- 

(在此示例中,我使用--command0终止-command0-。)

如何让program_options像这样处理它?<​​/ p>

1 个答案:

答案 0 :(得分:1)

如果您将command0command1的值作为单个字符串,我认为这是最好的。如,

wrapper --command0 "/path0/benchmark0 ..." --command1 "/path1/benchmark1 ..."

是的,还有更多工作要做,因为你必须wordexp各自的命令字符串(除非你已经将这些字符串直接传递给shell ;-)),但是它更清晰地分离了包装器的内容以及调用命令的内容。