2012-04-17 5 views
15

Tôi muốn sử dụng các giá trị mặc định cho một số đối số dòng lệnh của mình. Làm cách nào để tôi biết program_options tùy chọn mặc định là gì và, nếu người dùng không cung cấp đối số, làm cách nào để yêu cầu chương trình của tôi sử dụng giá trị mặc định?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?

Nói rằng tôi muốn có một cuộc tranh cãi quy định cụ thể số lượng robot để gửi trên một hung hăng giết người với giá trị mặc định 3.

robotkill --robots 5 sẽ tạo ra 5 robots have begun the silicon revolution, trong khi robotkill (không có đối số được cung cấp) sẽ tạo ra 3 robots have begun the silicon revolution.

+1

Giải pháp cho vấn đề này không thể đơn giản hơn, nhưng tôi không thể tìm thấy tài liệu ở bất cứ đâu, vì vậy tôi đã đưa ra câu hỏi này. – flies

+0

Related: cách để biết liệu tùy chọn có giá trị mặc định đã được cung cấp bởi người dùng http://stackoverflow.com/questions/9200598/boost-program-options-with-default-values-always-present-when-using -vm-count ('count' không hoạt động, rõ ràng bởi vì ngay cả khi tùy chọn không được cung cấp, bản đồ biến sẽ gán giá trị mặc định, vì vậy số đếm không bao giờ là 0) – flies

+1

http://www.boost.org/doc/ libs/1_65_1/doc/html/boost/program_options/typed_value.html # idp698602832-bb cho mô tả kỹ thuật và http://www.boost.org/doc/libs/1_65_0/doc/html/program_options/tutorial.html# idp419580960 cho giải thích hướng dẫn có liên quan. Phải thừa nhận rằng, tôi phải săn lùng những người sau khi sử dụng câu trả lời của bạn để tìm đúng tên để tìm kiếm. – patrickvacek

Trả lời

18

program_options tự động gán giá trị mặc định cho các tùy chọn khi người dùng không cung cấp các tùy chọn đó. Bạn thậm chí không cần phải kiểm tra xem người dùng đã cung cấp một tùy chọn đã cho hay chưa, chỉ cần sử dụng cùng một nhiệm vụ trong cả hai trường hợp.

#include <iostream> 
#include <boost/program_options.hpp> 

namespace po = boost::program_options; 

int main (int argc, char* argv[]) { 

    po::options_description desc("Usage"); 
    desc.add_options() 
    ("robots", po::value<int>()->default_value(3), 
    "How many robots do you want to send on a murderous rampage?"); 

    po::variables_map opts; 
    po::store(po::parse_command_line(argc, argv, desc), opts); 

    try { 
    po::notify(opts); 
    } catch (std::exception& e) { 
    std::cerr << "Error: " << e.what() << "\n"; 
    return 1; 
    } 

    int nRobots = opts["robots"].as<int>(); 
    // automatically assigns default when option not supplied by user!! 

    std::cout << nRobots << " robots have begun the silicon revolution" 
     << std::endl; 
    return 0; 
}