2012-02-08 6 views
13

Tôi đã cố gắng xác thực các tùy chọn đã chuyển của mình bằng tăng :: program_options. Lệnh của tôi có một số chế độ, mỗi chế độ có tham số liên quan có thể được chỉ định. Những gì tôi đang cố gắng làm là đảm bảo các params liên quan được thông qua với các chế độ, ví dụ:Tùy chọn chương trình tăng với giá trị mặc định luôn xuất hiện khi sử dụng vm.count()

unicorn --fly --magic-wings-threshold 

đâu --fly là chế độ và --magic-wings-threshold là một param liên quan. Điều tôi đã nhận thấy là nếu --magic-wings-threshold có giá trị mặc định, ví dụ:

("magic-wings-threshold,w", po::value<double>(&wings_thresh)->default_value(0.8, "0.8"), 
      "Magic wings maximum power" 
) 

sau đó tôi không thể sử dụng

if (vm.count("magic-wings-threshold")({ 
    // do stuff 
} 

để phát hiện nếu người dùng thông qua param đó.

Có vẻ như thông số giá trị mặc định luôn được chuyển và phát hiện trong vm.count(). Có ai biết giải pháp thay thế hay không?

+0

Tất cả những kỳ lân mà tôi quen thuộc không y và không có cánh. Có lẽ bạn đang nghĩ đến Pegasus? – flies

Trả lời

19

sử dụng boost::program_options::variable_value::defaulted()

if (vm["magic-wings-threshold"].defaulted()) { 
    // assume defaulted value 
} else { 
    // one was provided 
} 
+0

Tuyệt vời, đã hiệu quả. Cảm ơn Sam! – argoneus

+0

Tôi không nghĩ rằng giải pháp này hoạt động, không có cách nào để nói cho các -k vs no -k – intijk

0

Nếu bạn muốn nói với chênh lệch giữa

-k option not provided 
-k provided 

Bạn nên sử dụng po :: giá trị() ->implicit_value(), Bạn có thể nói với các tình huống khác nhau với:

-k option not provided -> vm["k"]==0 
-k option provided  -> vm["k"]==1