我正在使用boost :: program_options这样:
namespace po = boost::program_options;
po::options_description desc("Options");
desc.add_options()
("help,?", "Show Options")
("capture-file,I", po::value<string>(), "Capture File")
("capture-format,F", po::value<string>()->default_value("pcap"), "Capture File Format")
("output-file,O", po::value<string>()->default_value("CONOUT$"), "Output File");
po::variables_map vm;
po::store(po::command_line_parser(ac, av).options(desc)./*positional(pd).*/run(), vm);
Run Code Online (Sandbox Code Playgroud)
如果我通过命令行参数-I hithere它的工作原理,但我通过/I hithere升压抛出了boost::bad_any_cast一个what()"使用boost :: any_cast失败的转换"的.
是否可以使用program_options来解析/-delimitted或--delimitted选项?奖金的问题,可以将其进行配置,以便/和-设置相同的选项,但在彼此的二元对立?例如,/verbose可能意味着详细记录,而-verbose可能意味着更简洁的记录.
我使用boost.program_options库.考虑这个简化的案例.
po::options_description desc("Usage");
desc.add_options()
("uninstall,u", "uninstall program")
("custom,c", po::wvalue<std::wstring>(), "specify custom action");
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
Run Code Online (Sandbox Code Playgroud)
我想在这样的命令行上产生错误:
testprog.exe -u c- action1
Run Code Online (Sandbox Code Playgroud)
注意,用户输入错误"c-"而不是"-c".但解析器将此理解为单个-u选项.我该如何处理这类案件?
我想使用boost :: program_options创建一个可执行文件,可以调用如下:
./example --nmax=0,10 # nmax is chosen randomly between 0 and 10
./example --nmax=9 # nmax is set to 9
./example # nmax is set to the default value of 10
Run Code Online (Sandbox Code Playgroud)
以最小的代码以类型安全的方式实现这一目标的最佳方法是什么?
我正在使用boost :: program_options来处理程序的命令行参数.在下面的程序中,我希望将algo,exchange和admin_port组合在一起,以便它们都应该被提供,否则抛出异常(即除非它们在一起,否则没有意义).
我也想以一种显而易见的方式将它们打印出来.
如何最好地实现这一目标?
#include <boost/program_options.hpp>
#include <cassert>
#include <iostream>
#include <string>
namespace prog_opts = boost::program_options;
int main(int argc, char *argv[])
{
int rc = 0;
prog_opts::options_description desc("Usage");
desc.add_options()
("algo", prog_opts::value<std::string>(), "Name of the algo to run")
("exchanges", prog_opts::value< std::vector<std::string> >(), "Name(s) of the exchanges which will be available for use")
("admin_port", prog_opts::value<unsigned>(), "Admin port on which admin requests will be listened for")
("version", "Show version information")
("help", "Show help information");
prog_opts::variables_map args;
try
{
prog_opts::store(prog_opts::parse_command_line(argc, argv, desc), args); …Run Code Online (Sandbox Code Playgroud) 在示例(regex.cpp)中,库的作者为此结构创建了自定义结构(magic_number)和验证函数,以显示如何将自定义结构集成到程序选项中.我按照他的例子为自定义类(MyClass)创建了一个验证函数.编译器抱怨lecical_cast不适用于MyClass.然后std::istream& operator>>(std::istream& in, MyClass& d),我实现,删除void validate(.., MyClass*, ..),代码编译.任何人都可以解释为什么这个例子不需要operator>>,而我的不需要validate?
编辑:
#include <MyLib/MyClass.h>
std::istream& operator>>(std::istream& in, MyClass& obj) {
// some code to populate obj
return in;
}
po::variables_map parseCommandLine(int argc, char* argv[]) {
po::options_description options("Options");
options.add_options()
("help", "produce help message")
("obj", po::value<MyClass>(), "")
;
po::variables_map vm;
store(po::command_line_parser(argc, argv)
.options(options).run(), vm);
notify(vm);
return vm;
}
int main(int argc, char* argv[]) {
try {
po::variables_map vm = parseCommandLine(argc, argv);
MyClass obj = vm["my"].as<MyClass>(); …Run Code Online (Sandbox Code Playgroud) 我正在使用boost :: program_options来指定我的C++应用程序的参数.有没有办法指定一组备选方案中需要一个参数?
<application> [--one int-value1 | --two string-value2 | --three]
Run Code Online (Sandbox Code Playgroud)
另外,在上述中,用户必须通过替代的正好一个:--one,--two,或--three.
我可以手动执行此操作,但希望有一个内置机制而不是这个:
#include <boost/program_options.hpp>
namespace po = boost::program_options;
int main(int argc, char *argv[]) {
po::options_description options;
int band;
std::string titles_path;
options.add_options()
("one", po::value<int>(&band)->default_value(1))
("two", po::value<std::string>(&titles_path))
("three");
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, options), vm);
if (1 != (vm.count("one") + vm.count("two") + vm.count("three"))) {
std::cerr << options << std::endl;
return -11;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用提升选项有更好的方法吗?
我正在使用 boost::program_options 来解析程序的命令行,并且在尝试将值读取到也在命名空间中的类中的公共枚举中时遇到问题。
规格:
Boost 1.44.0
g++ 4.4.7
Run Code Online (Sandbox Code Playgroud)
我尝试按照Boost Custom Validator for Enum中阐述的过程进行操作,但它对我不起作用。
参数.h
#include <istream>
namespace SA
{
class Parameters
{
public:
enum Algorithm
{
ALGORITHM_1,
ALGORITHM_2,
ALGORITHM_3,
ALGORITHM_4
};
friend istream& operator>> (istream &in, Parameters::Algorithm &algorithm);
Algorithm mAlgorithm;
<More Parameters>
}
}
Run Code Online (Sandbox Code Playgroud)
参数.cpp
#include <boost/algorithm/string.hpp>
using namespace SA;
istream& operator>> (istream &in, Parameters::Algorithm &algorithm)
{
string token;
in >> token;
boost::to_upper (token);
if (token == "ALGORITHM_1")
{
algorithm = ALGORITHM_1;
}
else if (token == "ALGORITHM_2")
{ …Run Code Online (Sandbox Code Playgroud) 对我来说奇怪的是,boost的options_description使用没有反斜杠或分号或逗号的多行代码.我做了一点研究,但一无所获.
(代码来自官方的boost教程):
int opt;
po::options_description desc("Allowed options");
desc.add_options()
("help", "produce help message")
("optimization" , po::value<int>(&opt)->default_value(10), "optimization level")
("include-path,I ", po::value< vector<string> >() , "include path")
("input-file ", po::value< vector<string> >() , "input file") ;
Run Code Online (Sandbox Code Playgroud)
它是如何实现的?这是一个宏吗?
我有一个位置选项(文件名),我希望它是最后一个选项.基本上,用户可以在命令行上传递一堆东西,并且还使用-F作为文件名.但是,我希望用户也能够将文件名放在最后.
例如
./program --var 3 /path/to/file
Run Code Online (Sandbox Code Playgroud)
我当前实现的代码允许调用者将文件名放在命令行的任何位置.无论如何强迫位置参数总是在"常规"之后?
以下是我设置位置参数的方法:
pos_opts_desc.add("filename", -1);
Run Code Online (Sandbox Code Playgroud)
并解析命令行:
store(
command_line_parser(argc, argv).options(opts_desc).postional(pos_opts_desc).run(),
opts_var_map);
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助.
编辑添加:
我完全可以在命令行的任何地方指定-F.但是,如果设置是通过位置选项完成的,我想确保位置选项位于最后.
存在以下库文件:
cls /usr/local/Cellar/boost/1.51.0/lib $ ls libboost_program*
libboost_program_options-mt.a libboost_program_options-mt.dylib
Run Code Online (Sandbox Code Playgroud)
我包括以下标题#include <boost/program_options.hpp>:
cls /usr/local/Cellar/boost/1.51.0/include $ ls boost/program_options.hpp
boost/program_options.hpp
Run Code Online (Sandbox Code Playgroud)
我尝试链接库
-lboost_program_options-mt
-L/usr/local/Cellar/boost/1.51.0/lib
Run Code Online (Sandbox Code Playgroud)
(我假设库的名称是从文件名减去"lib"和文件结尾派生的.如果我尝试名字boost_program_options(没有-mt),我得到ld: library not found for -lboost_program_options)
这是我使用库的主要功能:
#include <boost/program_options.hpp>
#include <iostream
int main(int argc, char **argv) {
namespace opts = boost::program_options;
opts::options_description desc("EnsembleClustering options");
desc.add_options()
("hello", "produce greeting");
opts::variables_map vmap;
opts::store(opts::parse_command_line(argc, argv, desc), vmap);
opts::notify(vmap);
if (vmap.count("hello")) {
std::cout << "Hello World" << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
为什么这个设置会给我一个symbol(s) not found错误?
make all …Run Code Online (Sandbox Code Playgroud)