Boost:: program_options конфигурационный файл с несколькими токенами
Я, похоже, не могу читать из параметров многоточечного файла конфигурации, как я могу из командной строки. Каков синтаксис для файла конфигурации?
Вот как добавляется описание параметра:
//parser.cpp
- - -
po::options_description* generic;
generic=new po::options_description("Generic options");
generic->add_options()
("coordinate",po::value<std::vector<double> >()->multitoken(),"Coordinates (x,y)");
После этого я анализирую команду и конфигурационные файлы.
В командной строке "-координат 1 2" работает. Однако, когда я пытаюсь в файле конфигурации:
coordinate = 1,2
или
coordinate= 1 2
Он не дает исключение invalid_option_value. Итак, что же такое синтаксис для файлов конфигурации в случае многоточечных параметров?
Ответы
Ответ 1
Вы можете добиться желаемого поведения, написав пользовательский валидатор. Этот пользовательский валидатор принимает:
./progname --coordinate 1 2
./progname --coordinate "1 2"
#In config file:
coordinate= 1 2
Вот код:
struct coordinate {
double x,y;
};
void validate(boost::any& v,
const vector<string>& values,
coordinate*, int) {
coordinate c;
vector<double> dvalues;
for(vector<string>::const_iterator it = values.begin();
it != values.end();
++it) {
stringstream ss(*it);
copy(istream_iterator<double>(ss), istream_iterator<double>(),
back_inserter(dvalues));
if(!ss.eof()) {
throw po::validation_error("Invalid coordinate specification");
}
}
if(dvalues.size() != 2) {
throw po::validation_error("Invalid coordinate specification");
}
c.x = dvalues[0];
c.y = dvalues[1];
v = c;
}
...
po::options_description config("Configuration");
config.add_options()
("coordinate",po::value<coordinate>()->multitoken(),"Coordinates (x,y)")
;
Литература:
Ответ 2
В вашем файле конфигурации поместите каждый элемент вашего вектора в другую строку.
coordinate=1
coordinate=2
Ответ 3
Когда я столкнулся с подобной проблемой, я взял код выше из ответа Роба (с 4 мая 2011 года), но мне пришлось изменить несколько вещей из-за изменений в архитектуре boost и С++ 11. Я цитирую только те части, которые я изменил (или изменил бы). Остальное, что не входит в функцию проверки, остается неизменным. По причинам соответствия я добавил необходимые std:: префиксы.
namespace po = boost::program_options;
void validate(boost::any& v,
const std::vector<std::string>& values,
coordinate*, int) {
coordinate c;
std::vector<double> dvalues;
for(const auto& val : values) {
std::stringstream ss(val);
std::copy(std::istream_iterator<double>(ss), std::istream_iterator<double>(),
std::back_inserter(dvalues));
if(!ss.eof()) {
throw po::invalid_option_value("Invalid coordinate specification");
}
}
if(dvalues.size() != 2) {
throw po::invalid_option_value("Invalid coordinate specification");
}
c.x = dvalues[0];
c.y = dvalues[1];
v = c;
}
Переход от po:: validation_error к po:: invalid_option_value был намечен в fooobar.com/info/368073/...