2014-05-14 12 views
5

Với tùy chọn dòng lệnh, tôi có thể làm như sau:Phân tích cú pháp các tùy chọn chưa đăng ký để cấu hình tập tin trong chương trình Boost_options?

po::variables_map vm; 
auto parsedOptions = po::command_line_parser(argc, argv).options(optionsDescription1).allow_unregistered().run(); 
po::store(parsedOptions, vm); 
po::notify(vm); 

auto unregistered = po::collect_unrecognized(parsedOptions.options, po::include_positional); 
po::variables_map vm2; 
auto parsedOptions2 = po::command_line_parser(unregistered).options(optionsDescription2).run(); 
po::store(parsedOptions2, vm2); 
po::notify(vm2); 

này hoạt động tốt, vì collect_unregistered() thu thập các dòng lệnh mã thông báo chính xác như nó xuất hiện trong dòng lệnh. Tuy nhiên, nó không hoạt động cho các tập tin cấu hình. Tôi có thể phân tích cú pháp một tệp cấu hình cho phép các tùy chọn chưa đăng ký, nhưng khi tôi thu thập các tùy chọn chưa đăng ký, tôi nhận được kết quả mà tôi không thể sử dụng.

po::variables_map vm; 
auto parsedOptions = po::parse_config_file<char>(filename, optionsDescription1, true); 
po::store(parsedOptions, vm); 
po::notify(vm); 
auto unregistered = po::collect_unrecognized(parsedOptions.options, po::include_positional); 

Trong trường hợp này tôi nhận được tên và giá trị của các tùy chọn được liệt kê. Ví dụ, nếu tập tin cấu hình chứa các tùy chọn sau:

unregistered_option1=value1 
unregistered_option2=value2 

Sau đó, tôi nhận được các giá trị unregistered_option1, value1, unregistered_option2, value2 trong vector chuỗi unregistered. Trình phân tích cú pháp của Boost không thể làm gì hữu ích với định dạng này. Có cách nào để phân tích cú pháp danh sách này không (ví dụ: phân tích cú pháp tất cả các tùy chọn không được nhận dạng bởi options_description đầu tiên với options_description khác)? Tất nhiên tôi chỉ có thể phân tích cú pháp tệp lần nữa với số options_description thứ hai với số allow_unregistered được đặt, nhưng sau đó tôi không thể kiểm tra các tùy chọn không xác định cho cả hai mô tả.

Trả lời

3

Bạn không cần phải dựa vào những khiếm khuyết của giá trị collect_unrecognized() Đổi lại, bạn luôn có thể phát hiện, xử lý và tái tạo lại các tùy chọn chính mình, như là kết quả của parse_config_file() giữ mối quan hệ quan sát cho các tùy chọn vô danh:

auto parsed_options = parse_config_file(ifs, config_file_options, true); 
store(parsed_options, vm); 
... 
for (const auto& o : parsed_options.options) { 
    if (vm.find(o.string_key) == vm.end()) { 
     // an unknown option 
     cout << o.string_key << "=" << o.value << "\n"; 
    } 
} 
+0

Tôi không biết từ khi nào nhưng hiện tại có một thành viên dữ liệu bool '.regregered' bool trong các tùy chọn riêng lẻ được lặp lại. Vì vậy, không cần phải tìm kiếm tất cả các 'vm' để tìm hiểu xem nó đã được đăng ký nữa. – PeterT

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