2012-07-01 6 views
5

Có cách nào đơn giản để kiểm tra xem đối số của một tùy chọn có nằm trong một tập các lựa chọn được xác định trước không? "Đơn giản" ở đây có nghĩa là không xác định một lớp ad-hoc.boost options options options

Giả sử tôi có quyền lựa chọn --myoption mà phải có giá trị "myvalue1" hoặc "myvalue2"

Ví dụ trong python là thực sự dễ dàng với choices option in optparse

+1

Chẳng phải đây chỉ là so sánh chuỗi sao? Giả sử chúng là cả hai 'std :: string', bạn có thể làm' if ((arg == myvalue1) || (arg == myvalue2)) '. –

+0

chắc chắn, nó hoạt động, nhưng tôi cần một cái gì đó tích hợp hơn trong 'chương trình-tùy chọn' (ví dụ nó có thể thay đổi thông báo trợ giúp), ví dụ làm việc với non-string –

+0

Bạn có thể muốn giải thích thêm về những gì bạn muốn làm, nó không rõ ràng. –

Trả lời

0

Như tôi vừa mới nhận ra, bạn có thể xác định hai lựa chọn loại trừ lẫn nhau chỉ đơn giản là xác định một hàm nhỏ như được giải thích trong real.cpp. Ví dụ, bạn có thể chỉ định hai lựa chọn mâu thuẫn xác định một hàm conflicting_options():

void conflicting_options(const boost::program_options::variables_map & vm, 
         const std::string & opt1, const std::string & opt2) 
{ 
    if (vm.count(opt1) && !vm[opt1].defaulted() && 
     vm.count(opt2) && !vm[opt2].defaulted()) 
    { 
     throw std::logic_error(std::string("Conflicting options '") + 
           opt1 + "' and '" + opt2 + "'."); 
    } 
} 

và sau đó gọi

conflicting_options (vm, "quiet", "verbose"); 

ngay sau khi boost::program_options::store()

Kiểm tra rằng --myoption bằng myvalue1 hay myvalue2 sau đó chỉ cần trở thành một vấn đề của một cuộc gọi hàm.

Tôi vẫn không hiểu liệu có thể xác định hai tùy chọn vị trí loại trừ lẫn nhau hay không, nhưng đó phải là một câu hỏi khác.