增强程序选项和验证功能

Boost Program Options and validate function

本文关键字:验证 功能 选项 程序 增强      更新时间:2023-10-16

我正试图为程序增强选项编写自己的验证函数。然而,我得到:

"抛出'boost::exception_detail::clone_impl>'实例后调用终止What (): boost::bad_any_cast:使用boost::any_cast转换失败"

我看到类似的帖子甚至在这里stackoverflow,但我不能得到工作…下面是我的代码。嗯,我想,不知怎么的,我必须使用lexical_cast并自己编写这个类型转换,但我失败了……

在其中一个头文件中,我有:

enum class LogSeverityLevel : std::int8_t { E_LOG_TRACE = 0,
                                            E_LOG_DEBUG,
                                            E_LOG_INFO,
                                            E_LOG_WARN,
                                            E_LOG_ERROR};

在我的main.cpp文件中:

void validate(boost::any& v,
          const std::vector<std::string>& values,
          LogSeverityLevel*, int)
{
    // Make sure no previous assignment to 'a' was made.
    po::validators::check_first_occurrence(v);
    // Extract the first string from 'values'. If there is more than
    // one string, it's an error, and exception will be thrown.
    const std::string& s = po::validators::get_single_string(values);
    const std::string& s_capitalized = boost::to_upper_copy(s);
    if (s_capitalized== "ERROR") {
        v = boost::any(LogSeverityLevel::E_LOG_ERROR);
    } else if (s_capitalized == "WARN") {
        v = boost::any(LogSeverityLevel::E_LOG_WARN);
    } else if (s_capitalized == "INFO") {
        v = boost::any(LogSeverityLevel::E_LOG_INFO);
    } else if (s_capitalized == "DEBUG") {
        v = boost::any(LogSeverityLevel::E_LOG_DEBUG);
    } else if (s_capitalized == "TRACE") {
        v = boost::any(LogSeverityLevel::E_LOG_TRACE);
    } else {
        throw po::validation_error(po::validation_error::invalid_option_value);
    }
}

,之后在main.cpp:

    desc.add_options()
    ("help,h", "print this help")
    ("version,v", "show application version")
    ("log-level", po::value<std::string>()->default_value("DEBUG"), "set log level")
    ;

然后:

    if (vm.count("log-level")) {
        setLogSeverityLevel(vm["log-level"].as<LogSeverityLevel>());
>

在定义选项时使用特殊的选项类型而不是字符串:

desc.add_options()
("help,h", "print this help")
("version,v", "show application version")
("log-level", po::value<LogSeverityLevel>()
    ->default_value(LogSeverityLevel::E_LOG_DEBUG, "DEBUG"), "set log level")
;