Учитывая строку «1, 2, 3, 10, 15», ожидаемый результат должен быть 01, 02, 03, 10, 15 - то есть добавление «0» к анализируемому атрибуту, если его размер не равен 2.Я бы легко сделал это с лямбдами как семантическими действиями, но как выполнить задачу, не используя их?Я подозреваю, что здесь нужно сыграть в некоторые хитрые игры qi :: _ val и qi :: _ 1.То, что я действительно хотел, было бы
s = qi::repeat(1,2)[qi::digit]
[(
[](auto& parsed_number)
{
return parsed_number.size()==2 ?
parsed_number : std::string("0") + parsed_number;
}
]);
, но это не работает таким образом
#include <boost/spirit/include/qi.hpp>
#include <vector>
#include <string>
#include <iostream>
namespace qi = boost::spirit::qi;
using V = std::vector<std::string>;
template<typename It, typename Skipper>
struct G: qi::grammar<It, V(), Skipper>
{
G(): G::base_type(v)
{
v = s % ',';
s = qi::repeat(1,2)[qi::digit];
}
private:
qi::rule<It, V(), Skipper> v;
qi::rule<It, std::string(), Skipper> s;
};
int main()
{
const std::string s = "1, 2, 3, 10, 15";
std::string::const_iterator beg(s.begin()), e;
G<decltype(beg), qi::space_type> g;
V R;
bool b = qi::phrase_parse(beg, e, g, qi::space, R);
if(!b){
std::cerr << "parsing failed\n";
return -1;
}
for(const auto& r: R) std::cout << r << '\n';
}