부스트에서 빈 값을 받아들이는 방법 :: program_options
-
05-07-2019 - |
문제
Boost :: program_options 라이브러리를 사용하여 명령 줄 매개 변수를 처리하고 있습니다. 빈 옵션을 통해 파일 이름을 수락해야합니다.
desc.add_options()
("replay,r", boost::program_options::value<std::string>(), "bla bla bla")
이 경우 Boost는 Params없이 -r를 받아들이지 않고 예외를 던집니다. default_value () 옵션은 작동하지 않으며 사용자가 -r 옵션을 제공하지 않더라도 라이브러리 반환 값을 만들 수 있습니다.
일하는 방법이 있습니까?
해결책
사용하십시오 implicit_value
방법, 예를 들어
desc.add_options()
("replay,r", po::value<std::string>()->implicit_value("stdin"), "bla bla bla")
이렇게하면 옵션이 0 또는 1 토큰을 허용하며 토큰이 제공되지 않으면 'Stdin'이 제공되는 것처럼 작용합니다. 물론 MCH가 제안한 것처럼 빈 문자열과 '-'를 포함하여 다른 암시 적 값을 선택할 수 있습니다.
다른 팁
당신은 트릭을 시도 할 수 있습니다 multitoken
그리고 zero_tokens
옵션 :
using namespace std;
namespace po = boost::program_options;
vector<string> replay;
po::options_description desc("Allowed options");
desc.add_options()
("replay,r", po::value< vector<string> >(&replay)->multitoken()->zero_tokens(), "bla bla bla");
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
if (vm.count("replay"))
{
size_t s = vm["replay"].as< vector<string> >().size();
if (s == 0)
cout << "replay without args" << endl;
else if (s == 1)
cout << "replay with one arg" << endl;
else
cout << "replay with multiple args" << endl;
}
else
cout << "replay not specified" << endl;
그런 다음 요소의 수를 계산하십시오 replay
벡터. 여러 인수가 전달되면 오류를 던지고 싶을 것입니다. 다시 하다 옵션.
라이브러리를 구문 분석하는 명령 줄을 사용하면 논쟁을 할 수있는 옵션을 가질 수 있다고 생각하지 않습니다. 옵션에 인수가 필요한 경우 하나를 제공해야합니다. 이 경우 표준 실습 ( *nix 어쨌든)은 표준 입력에서 읽으려는 것을 나타내는 파일 이름으로 사용하는 것입니다.
제휴하지 않습니다 StackOverflow