Có cách nào để đặt một tập hợp các biến đầu vào được cho phép cho các tham số không? Ví dụ tham số "arg" có thể chỉ có các giá trị chuỗi như "cat" và "dog".Tùy chọn chương trình tăng cho phép thiết lập các giá trị đầu vào
Trả lời
Tôi đã lướt qua tài liệu Boost.Program_options và không rõ ràng cho dù bạn có thể làm điều đó. Tôi có ấn tượng rằng thư viện chủ yếu quan tâm đến việc phân tích cú pháp phân tích cú pháp dòng lệnh, không xác thực nó. Bạn có thể làm việc gì đó với một số custom validator, nhưng điều đó liên quan đến việc ném ngoại lệ khi bạn nhận được đầu vào xấu (có thể là một lỗi nghiêm trọng hơn bạn muốn). Tôi nghĩ rằng tính năng này hướng đến việc đảm bảo bạn thực sự có một chuỗi, chứ không phải là "con mèo" hay "con chó". Giải pháp đơn giản nhất tôi có thể nghĩ là để thư viện phân tích cú pháp dòng lệnh như bình thường, sau đó thêm mã của riêng bạn sau để xác minh --arg
được đặt thành cat
hoặc dog
. Sau đó, bạn có thể in lỗi và thoát, hoàn nguyên về một số mặc định phù hợp hoặc bất kỳ điều gì bạn thích.
Bạn có thể sử dụng tính năng custom validator. Xác định một loại riêng biệt cho tùy chọn của bạn, và sau đó quá tải chức năng validate
trên loại đó.
struct catdog {
catdog(std::string const& val):
value(val)
{ }
std::string value;
};
void validate(boost::any& v,
std::vector<std::string> const& values,
catdog* /* target_type */,
int)
{
using namespace boost::program_options;
// Make sure no previous assignment to 'v' was made.
validators::check_first_occurrence(v);
// Extract the first string from 'values'. If there is more than
// one string, it's an error, and exception will be thrown.
std::string const& s = validators::get_single_string(values);
if (s == "cat" || s == "dog") {
v = boost::any(catdog(s));
} else {
throw validation_error(validation_error::invalid_option_value);
}
}
Ngoại lệ được ném từ mã đó không khác với ngoại lệ được ném cho bất kỳ giá trị tùy chọn không hợp lệ nào khác, vì vậy bạn đã sẵn sàng để xử lý chúng.
Sử dụng các loại tùy chọn đặc biệt thay vì chỉ string
khi bạn xác định lựa chọn của bạn:
desc.add_options()
("help", "produce help message")
("arg", po::value<catdog>(), "set animal type")
;
tôi đã sáng tác một live example demonstrating use of this code.
Cách tiếp cận rất đơn giản là có "động vật" như một chuỗi bình thường và sau khi thông báo cho bạn kiểm tra và ném nếu cần.
if (vm.count("animal") && (!(animal == "cat" || animal == "dog")))
throw po::validation_error(po::validation_error::invalid_option_value, "animal");
Đây không phải là những gì Michael đề xuất? –
@RobKennedy Ngoại trừ việc Michael nói "Đây là những gì bạn có thể làm", trong khi jorgen nói "Đây là những gì bạn có thể làm, và đây là cách nó sẽ trông như thế nào" –
- 1. Tăng Tùy chọn Chương trình Thêm Tùy chọn Cú pháp
- 2. PHP thiết lập các giá trị đầu vào với isset
- 3. Lập trình thiết lập giá trị đã chọn của một dijit Chọn tiện ích
- 4. Giá trị thiết lập động của đầu vào tệp
- 5. Làm cách nào để nhận các giá trị đối số mặc định bằng các tùy chọn chương trình tăng cường?
- 6. Thiết lập giá trị của đầu vào ngày trên iPad
- 7. Làm cách nào để có tùy chọn bật các tùy chọn khác trong Tùy chọn chương trình tăng cường mà không sử dụng các biến?
- 8. thiết lập trình giá trị trường cho SharePoint listitem
- 9. Hiện/ẩn các trường tùy thuộc vào giá trị chọn
- 10. 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()
- 11. jQuery chọn các phần tử tùy chọn theo giá trị
- 12. thiết lập một giá trị tùy chọn HTML để chuỗi rỗng
- 13. Lập trình buộc các giá trị trường cho TFS WorkItem
- 14. Tăng cường các thư viện đồ thị: thiết lập các giá trị trọng số cạnh
- 15. jQuery nhận id tùy chọn chọn và thay đổi giá trị đầu vào bị ẩn
- 16. lập trình thay đổi Manifest - cho phép tùy chỉnh Android
- 17. Cách chọn giá trị đầu vào khi nhấp vào?
- 18. Rails collection_select giá trị thiết lập cho bao gồm
- 19. luận Vector trong Boost Tùy chọn Chương trình
- 20. Rails f.check_box thiết lập các giá trị đã chọn/không được kiểm tra
- 21. Magento - Nhận Tuỳ chỉnh chi tiết Lựa chọn giá trị gia tăng từ Tùy chọn Giá trị ID
- 22. Trình duyệt cách trung lập để thêm tùy chọn vào phần tử được chọn trong javascript
- 23. thiết lập lựa chọn của NSOutlineView theo chương trình (và nhận được lựa chọn của NSTableView)
- 24. document.getElementById() giá trị không thiết lập giá trị
- 25. Tùy chọn tìm kiếm jQuery trong Chọn với giá trị rỗng/null loại bỏ nó và chọn tùy chọn đầu tiên sau giá trị
- 26. Làm thế nào để thiết lập giá trị của thẻ đầu vào trong casperJs
- 27. Thiết lập KVO cho các giá trị được tính toán, dựa trên các giá trị được tính toán
- 28. Các tham số đa giá trị tùy chọn trong SSRS
- 29. Tùy chọn Android: Cách tải các giá trị mặc định khi người dùng không sử dụng màn hình tùy chọn?
- 30. đặt giá trị var từ giá trị trường đầu vào
Ví dụ này trông rất giống với một trong những quy định trong [tài liệu chính thức] (http://www.boost.org/doc/libs/1_55_0/doc/html/program_options/howto.html#idp163429032) . Tuy nhiên, bạn cần triển khai hàm toán tử trích xuất quá 'std :: istream & operator >> (std :: istream & in, catdog & cd)' '{' 'return in >> in.value;' '} ' ' – russoue
Có, @Russoue, mã của tôi được điều chỉnh trực tiếp từ tài liệu mà tôi đã liên kết trước đó. Tôi không biết tại sao bạn nghĩ rằng mã cần khai thác luồng, mặc dù. Tôi đã bao gồm một ví dụ làm việc làm sai lệch yêu cầu của bạn. Tài liệu sử dụng 'lexical_cast' để chuyển đổi từ chuỗi đầu vào sang kiểu dữ liệu mong muốn, và nếu bạn muốn sử dụng cùng một kỹ thuật đó, thì bạn sẽ thực sự cần phải thực hiện' toán tử >> '. Ví dụ của tôi sử dụng xây dựng trực tiếp, mặc dù. * Cách * để tạo kiểu tùy chỉnh từ một chuỗi nằm ngoài phạm vi của câu hỏi này. –