提升程序选项:参数被多次检测到
boost program options: argument being detected more than once
以下代码检测到不止一次指定的参数。
实现了命令行参数解析器,以确保用户提供string (mps-file)
,integer (n)
和sequence of integer (0, n-1)
允许其他人是可选的。
但是,当使用以下标志编译代码时:
g++ -std=c++11 test.cpp /home/not_me/my_lib/boost_1_64_0/stage/lib/libboost_program_options.so
完美编译的。但是,当执行以下方式执行时,它会引发以下异常。
/src/a.out --mps-file earth.mps --n 5 --size 10 --seed 10 --order 0 1 2 3 4
error: option '--mps-file' cannot be specified more than once
但是,如果使用以下命令执行,则运行良好:
./src/a.out earth.mps 5 10 10 --order 0 1 2 3 4
完整代码:
#include <iostream>
#include <numeric>
#include <boost/program_options.hpp>
int main (int argc, char* argv[]) {
int n;
int sample_size = 10;
std::random_device rd;
int seed = rd();
std::string mps_name;
std::vector<int> order;
boost::program_options::options_description desc("options");
desc.add_options()
("mps-file", boost::program_options::value<std::string>(&mps_name)->required(), "input mps file")
("n", boost::program_options::value<int>(&n)->required(), "number of variables")
("size", boost::program_options::value<int>(&sample_size)->default_value(sample_size), "size of sample")
("seed", boost::program_options::value<int>(&seed)->default_value(seed), "seed value")
("order", boost::program_options::value<std::vector<int>>(&order)->required(), "ordering")
("help", "this help message")
;
boost::program_options::positional_options_description p;
p.add("mps-file", 1);
p.add("n", 1);
p.add("order", -1);
boost::program_options::variables_map vm;
try {
boost::program_options::store(boost::program_options::command_line_parser(argc, argv).
options(desc).positional(p).run(), vm);
if (vm.count("help") || argc == 1) {
std::cout << "usage: " << argv[0] << " [options]" << std::endl;
std::cout << desc;
return -1;
}
boost::program_options::notify(vm);
}
catch (std::exception& e) {
std::cout << "error: " << e.what() << std::endl;
return -1;
}
std::vector<int> temp = order;
std::sort(temp.begin(), temp.end());
for (int i = 0; i < n; ++i) {
if (temp[i] == i) { continue; }
std::cout << "incorrect ordering given" << std::endl;
return -1;
}
if (n != order.size()) {
std::cout << "mismatch between the 'n' and given ordering" << std::endl;
return -1;
}
return 0;
} // main
问题是位置选项。当您删除它们并从boost::program_options::command_line_parser(argc, argv).
options(desc).positional(p).run()
拨打positional(p)
您的问题将消失。由于您仅删除add()
行并离开positional(p)
,因此您遇到了一个不同的问题:"在命令行上指定了太多的位置选项"。
我想您的电话问题:
/src/a.out --mps-file earth.mps --n 5 --size 10 --seed 10 --order 0 1 2 3 4
是,当位置1上定义了位置选项时,字符串---mps-file
可能被视为该选项本身的值。因此,如果将选项定义为位置,则可能应该避免使用名称的选项。
相关文章:
- 如何检测参数包中的uint8_t类型
- 无法使用 auto 来参数化true_type来检测 T::value()
- 检测习惯用语和默认参数类型匹配
- 检测传递给函数模板函数参数的特定函数
- 类型检测:使用variadic参数正确实现计算平均值的函数
- 如何在 Lua 回调中检测可选的第一个参数
- 有没有办法在编译时检测是否可以使用一组给定的参数类型成功调用通用 lambda?
- C++默认参数通过_CrtMemDifference屏蔽内存泄漏检测
- LLVM 的位码错误检测函数参数
- 参数类型的编译时类型检测
- 检测一个可以使用模板元编程可以采用的函数的最大参数数量
- 如何检测我何时向可变参数函数传递"std::string"而不是"c_str()"
- C++检测类型是否具有模板参数
- 如何在变量函数参数列表中检测给定类型的参数的可用性,并在处理完所有参数后采取行动
- 提升程序选项:参数被多次检测到
- 错误C2664:无法转换参数(指纹传感器检测)
- 函数有没有办法自动检测其参数的数据类型?(请不要建议函数重载)
- 如何检测作为参数传递的函数的参数类型
- 检测参数类型、值以及另一个函数的名称和返回值的函数
- 使用C++检测习惯用法计算任意可调用对象的参数