Вы можете использовать пользовательский валидатор .Определите отдельный тип для вашего параметра, а затем перегрузите функцию validate
для этого типа.
struct catdog {
catdog(std::string const& val):
value(val)
{ }
std::string value;
};
void validate(boost::any& v,
std::vector<std::string> const& values,
catdog* /* target_type */,
int)
{
using namespace boost::program_options;
// Make sure no previous assignment to 'v' was made.
validators::check_first_occurrence(v);
// Extract the first string from 'values'. If there is more than
// one string, it's an error, and exception will be thrown.
std::string const& s = validators::get_single_string(values);
if (s == "cat" || s == "dog") {
v = boost::any(catdog(s));
} else {
throw validation_error(validation_error::invalid_option_value);
}
}
Исключения, генерируемые из этого кода, ничем не отличаются от исключений, генерируемых для любого другого недопустимого значения параметра, поэтомувы уже должны быть готовы обработать их.
Используйте специальный тип опции вместо просто string
, когда определяете свои опции:
desc.add_options()
("help", "produce help message")
("arg", po::value<catdog>(), "set animal type")
;
Я составил liveпример, демонстрирующий использование этого кода .