2016-03-08 85 views
3

我想使用自定义验证器而不是重载operator>>以支持我的选项解析中的枚举类型。我也做了以下内容:自定义验证器不允许default_value

#include <iostream> 

#include <boost/program_options.hpp> 

enum class MyEnum 
{ 
    OneThing, 
    AnotherThing 
}; 

void validate(boost::any& v, const std::vector<std::string>& values, 
       MyEnum*, int) 
{ 
    // parse the enum from values[0] 
    std::cout << "Test" << std::endl; 
    MyEnum enumValue = MyEnum::OneThing; 
    v = enumValue; 
} 

int main(int argc, char*argv[]) 
{ 
    namespace po = boost::program_options; 

    po::options_description desc("Options"); 

    //desc.add_options()("myEnum", po::value<MyEnum>(), "MyEnum value"); // works fine 
    desc.add_options()("myEnum", po::value<MyEnum>()->default_value(MyEnum::OneThing), "MyEnum value"); // compiler error: Source type is not streamable 

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

    MyEnum myEnum = vm["myEnum"].as<MyEnum>(); 

    return 0; 
} 

这工作得很好,只要我不尝试设置default_value,但是当我做指定DEFAULT_VALUE,我得到error: static assertion failed: Source type is neither std::ostream able nor std::wostream able。我还需要什么(无需重载流操作符,这是使用验证器的最重要的部分,据我了解)要允许自定义类型获得default_value?

回答

3

您可以设置一个默认值,但是,它需要知道如何在描述中表示默认值。

由于枚举不流式传输,自动方式不起作用,所以你必须指定它,例如:

default_value(MyEnum::OneThing, "OneThing") 

Live On Coliru

#include <iostream> 

#include <boost/program_options.hpp> 

enum class MyEnum 
{ 
    OneThing, 
    AnotherThing 
}; 

void validate(boost::any& v, const std::vector<std::string>& values, 
       MyEnum*, int) 
{ 
    // parse the enum from values[0] 
    std::cout << "Test" << std::endl; 
    MyEnum enumValue = MyEnum::OneThing; 
    v = enumValue; 
} 

int main(int argc, char*argv[]) 
{ 
    namespace po = boost::program_options; 

    po::options_description desc("Options"); 

    //desc.add_options()("myEnum", po::value<MyEnum>(), "MyEnum value"); // works fine 
    desc.add_options()("myEnum", po::value<MyEnum>()->default_value(MyEnum::OneThing, "OneThing"), "MyEnum value"); 

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

    MyEnum myEnum = vm["myEnum"].as<MyEnum>(); 
    std::cout << std::boolalpha << (myEnum == MyEnum::OneThing) << "\n"; 
} 

打印

true 
+0

奇怪,我会认为默认值的实际值存储在选项中,而不是会产生该值的字符串。它虽然工作,欢呼。 –

+1

如果你仔细阅读,你会注意到,我不是说别的。我**做了**解释为什么你需要有文字表示。所以也许你想再读一遍:) – sehe