首页 > 解决方案 > 如何确定是否为 boost::program_options 提供了参数,或者是否使用默认值?

问题描述

使用boost::program_options,我需要设置default_value以使该默认值在帮助消息中可见。但是,仍然需要知道是否应用了默认值或是否提供了参数。(在某些情况下,如果提供了参数,逻辑将覆盖现有配置)。

可能的解决方案:


如何检测是否提供了参数,或者是否应用了默认值?

标签: c++boostboost-program-options

解决方案


您的选项描述已损坏。让我们修复它们。我选择了ip_arg/port_arg变量(请注意您如何将它们复制粘贴错误)。

po::options_description options("Options");
options.add_options()
    ("ip", po::value<std::string>(&ip)->default_value("127.0.0.1"), "IP") //
    ("port", po::value<std::string>(&port)->default_value("80"), "Port")
 ;

现在你可以确定port总是设置,所以.count()还是.contains()多余的。相反,询问地图条目是否已默认:

if (vm["port"].defaulted()) {
    std::cout << "Port defaulted (" << port << ")\n";
} else {
    std::cout << "Port specified as " << port << "\n";
}

现场演示

住在科利鲁

#include <boost/filesystem.hpp>
#include <boost/program_options.hpp>
#include <iostream>
namespace po = boost::program_options;
namespace fs = boost::filesystem;

int main( int argc, char* argv[])
{
    std::string ip;
    std::string port;

    po::options_description options("Options");
    options.add_options()
        ("ip", po::value<std::string>(&ip)->default_value("127.0.0.1"), "IP") //
        ("port", po::value<std::string>(&port)->default_value("80"), "Port")
     ;

    po::variables_map vm;
    try {
        using bs = po::command_line_style::style_t;

        boost::program_options::store(
            boost::program_options::command_line_parser(argc, argv)
                .options(options)
                .style(bs::long_allow_next | bs::allow_long | bs::allow_short |
                       bs::allow_dash_for_short | bs::long_allow_adjacent |
                       bs::short_allow_adjacent | bs::short_allow_next |
                       bs::allow_long_disguise)
                .run(),
            vm);

        po::notify(vm);
    } catch (...) {
        std::cerr << "Some error" << std::endl;
        return 1;
    }

    std::cout << options << std::endl;

    if (vm["port"].defaulted()) {
        std::cout << "Port defaulted (" << port << ")\n";
    } else {
        std::cout << "Port specified as " << port << "\n";
    }
}

打印例如

$ ./test --ip=192.168.1.2
Options:
  --ip arg (=127.0.0.1) IP
  --port arg (=80)      Port

Port defaulted (80)

或者

$ ./test --port=8080
Options:
  --ip arg (=127.0.0.1) IP
  --port arg (=80)      Port

Port specified as 8080

推荐阅读