Boost.Program_options:带有状态的自定义验证器

时间:2018-10-17 13:40:33

标签: c++ boost command-line-interface boost-program-options

我想为命令行选项编写一个自定义验证器,该选项可以在一组允许的值中采用一个值,例如对于诸如

的选项
--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完全具有状态吗?

0 个答案:

没有答案