gpt4 book ai didi

c++ - 自定义验证器不允许 default_value

转载 作者:太空狗 更新时间:2023-10-29 21:16:11 26 4
gpt4 key购买 nike

我正在尝试使用自定义验证器而不是重载 operator>> 来支持我的选项解析中的枚举类型。我做了以下事情:

#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 或 std::wostream able。我还需要做什么(不重载流运算符,据我所知这是使用验证器的全部意义)来允许自定义类型获得 default_value?

最佳答案

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

由于枚举不可流式传输,自动方式不起作用,因此您必须指定它,例如:

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

关于c++ - 自定义验证器不允许 default_value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35869803/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com