我想为命令行选项编写一个自定义验证器,该选项可以在一组允许的值中采用一个值,例如对于诸如
的选项--animal arg Allowed values: cat, dog, bird
为此,我定义了一个新类型RestrictedIdentifierOption
:
class RestrictedIdentifierOption
{
public:
using ValueType = std::pair<std::string, boost::any>;
using ValueContainer = std::vector<ValueType>;
explicit RestrictedIdentifierOption(const ValueContainer& allowedValues);
private:
friend void validate(
boost::any& v,
const std::vector<std::string>& values,
RestrictedIdentifierOption* option,
int);
private:
ValueContainer m_allowedValues;
};
而我根据documentation重载了validate()
:
void validate(
boost::any& v,
const std::vector<std::string>& values,
RestrictedIdentifierOption* option,
int)
{
...
}
最后,我声明一个选项:
auto option = boost::make_shared<bpo::option_description>(
"animal,a",
new bpo::typed_value<RestrictedIdentifierOption>(new RestrictedIdentifierOption({ { "cat", 1 }, { "dog", 2 }, { "bird", 3 } })),
"Allowed values: cat, dog, bird");
(请不要在这里注意内存泄漏,这不是重点。)
我天真地希望option
中的validate()
参数将设置为我创建的实例,但是它始终等于nullptr
。
我要做什么是不合理的?自定义验证器可以通过Boost.Program_options完全具有状态吗?