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ả.
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