Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost程序选项和验证功能_C++_Boost_Boost Program Options - Fatal编程技术网

C++ Boost程序选项和验证功能

C++ Boost程序选项和验证功能,c++,boost,boost-program-options,C++,Boost,Boost Program Options,我正在尝试为程序boost选项编写自己的验证函数。然而,我得到: 在抛出“boost::exception\u detail::clone\u impl>的实例后调用terminate 什么:boost::bad_any_cast:使用boost::any_cast转换失败 我甚至在stackoverflow上看到过类似的帖子,但我无法让它正常工作。。。下面是我的代码。嗯,我想,不知何故,我不得不使用词法和自己写这个演员,但我失败了 在其中一个头文件中,我有: enum class LogS

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

在抛出“boost::exception\u detail::clone\u impl>的实例后调用terminate 什么:boost::bad_any_cast:使用boost::any_cast转换失败

我甚至在stackoverflow上看到过类似的帖子,但我无法让它正常工作。。。下面是我的代码。嗯,我想,不知何故,我不得不使用词法和自己写这个演员,但我失败了

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

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")
;

谢谢你的建议-但是由于你的改变,我甚至不能编译代码。。。一开始可能不错,但我想这还不够,对吗`/usr/include/boost/lexical_cast.hpp:在成员函数'bool boost::detail::lexical_stream'中,我说得对-好吧,你告诉我。我可能猜默认的_值规范是错误的。尝试不使用DEBUG或使用DEBUG作为默认值?我尝试了不同的组合,看起来只有log-level、po::value、set-log-level有效。这还不错,但如果我也能让默认值选项工作,我会很高兴的。。。po::value->default\u valueDEBUG给我错误:调用'boost::program\u options::typed\u value::default\u valueconst char[6]'时没有匹配的函数@user1703589 Use-po::value->default\u valueLogSeverityLevel::E\u LOG\u DEBUG,DEBUG;或者为你的类型专门化词法转换哇!不,它有效;谢谢它的工作,但只有一个平台上,我写的。。。另一方面,它只适用于日志级别po::value和set log level。否则,我会得到:/usr/include/boost/lexical_cast.hpp:“bool boost::detail::lexical_stream\u limited\u src::shr\u using_base\u classInputStreamable&[使用InputStreamable'…如果您的样本是独立的,您会发现您会得到更多高质量的答案。我并不总是有时间做额外的工作。我90%的答案中都有关于Coliru的样本。