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?
奇怪,我会认为默认值的实际值存储在选项中,而不是会产生该值的字符串。它虽然工作,欢呼。 –
如果你仔细阅读,你会注意到,我不是说别的。我**做了**解释为什么你需要有文字表示。所以也许你想再读一遍:) – sehe