2010-02-08 19 views
7

Tôi đã viết một ứng dụng nhỏ sử dụng boost :: program_options để phân tích cú pháp dòng lệnh. Tôi muốn có một số tùy chọn đặt giá trị nếu đối số có mặt, và luân phiên in giá trị hiện tại nếu tham số được đưa ra nhưng không có đối số. Vì vậy, "thiết lập chế độ" sẽ như thế nào:Tham số có và không có đối số trong tăng :: program_options

dc-ctl --brightness 15 

và "có được chế độ" sẽ là:

dc-ctl --brightness 
brightness=15 

Vấn đề là, tôi không biết làm thế nào để xử lý các trường hợp thứ hai mà không đánh bắt này ngoại lệ:

error: required parameter is missing in 'brightness' 

Có cách nào dễ dàng để tránh việc xảy ra lỗi đó không? Nó xảy ra ngay sau khi các đối số được phân tích cú pháp.

Trả lời

4

Tôi nhận được giải pháp một phần từ How to accept empty value in boost::program_options, đề xuất sử dụng phương pháp implicit_value trên các thông số có thể có hoặc không có đối số. Vì vậy, cuộc gọi của tôi để khởi tạo "sáng" thông số như sau:

("brightness,b", po::value<string>()->implicit_value(""), 

sau đó tôi lặp qua các bản đồ khác nhau và đối với bất kỳ lý lẽ đó là một chuỗi, tôi kiểm tra nếu nó hoàn toàn trống và nếu vì vậy tôi in các giá trị hiện tại . mã mà trông như thế này:

// check if we're just printing a feature's current value 
    bool gotFeature = false; 
    for (po::variables_map::iterator iter = vm.begin(); iter != vm.end(); ++iter) 
    { 
     /// parameter has been given with no value 
     if (iter->second.value().type() == typeid(string)) 
      if (iter->second.as<string>().empty()) 
      { 
       gotFeature = true; 
       printFeatureValue(iter->first, camera); 
      } 
    } 

    // this is all we're supposed to do, time to exit 
    if (gotFeature) 
    { 
     cleanup(dc1394, camera, cameras); 
     return 0; 
    } 

UPDATE: điều này thay đổi cú pháp nêu trên, khi sử dụng các giá trị tiềm ẩn, bây giờ tranh cãi, khi được đưa ra, phải có dạng:

./dc-ctl -b500 

thay vì

./dc-ctl -b 500 

Hy vọng điều này hữu ích cho người khác.

Các vấn đề liên quan