문제

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 어쨌든)은 표준 입력에서 읽으려는 것을 나타내는 파일 이름으로 사용하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top