2012-04-17 2 views
15

Я хочу использовать значения по умолчанию для некоторых аргументов командной строки. Как сообщить program_options, что такое параметр по умолчанию, и, если пользователь не предоставил аргумент, Как мне сообщить моей программе использовать значение по умолчанию?Как получить значения аргументов по умолчанию с помощью опций форматирования?

Скажем, я хочу иметь аргумент, указывающий количество роботов, чтобы отправить на убийственной неистовствовали со значением по умолчанию 3.

robotkill --robots 5 будет производить 5 robots have begun the silicon revolution, в то время как robotkill (без аргументов в комплект поставки) не будет производить 3 robots have begun the silicon revolution.

+1

Решение этой проблемы не может быть проще, но я не мог найти ее документированной нигде, поэтому я задал этот вопрос. – flies

+0

Связано: как определить, предоставлен ли параметр со значением по умолчанию пользователем http://stackoverflow.com/questions/9200598/boost-program-options-with-default-values-always-present-when-using -vm-count ('count' не работает, по-видимому, потому что, даже если опция не указана, переменная map присваивает значение по умолчанию, поэтому счет никогда не равен нулю) – flies

+1

http://www.boost.org/doc/ libs/1_65_1/doc/html/boost/program_options/typed_value.html # idp698602832-bb для технического описания и http://www.boost.org/doc/libs/1_65_0/doc/html/program_options/tutorial.html# idp419580960 для соответствующего объяснения учебника. По общему признанию, я должен был охотиться за теми, кто использовал ваш ответ, чтобы найти правильное имя для поиска. – patrickvacek

ответ

18

program_options автоматически присваивает значения по умолчанию параметрам, если пользователь не предоставляет эти параметры. Вам даже не нужно проверять, предоставил ли пользователь данную опцию, просто используйте одно и то же назначение в любом случае.

#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; 
}