Restringindo o Boost.Spirit real_parser existente (com uma política)

Desejo analisar um float, mas não permitir valores de NaN, por isso gere uma política que herda da política padrão e cria umreal_parser com isso:

// using boost::spirit::qi::{real_parser,real_policies,
//                           phrase_parse,double_,char_};

template <typename T>
struct no_nan_policy : real_policies<T>
{
    template <typename I, typename A>
    static bool
    parse_nan(I&, I const&, A&) {
          return false;
    }    
};

real_parser<double, no_nan_policy<double> > no_nan;

// then I can use no_nan to parse, as in the following grammar
bool ok = phrase_parse(first, last, 
   no_nan[ref(valA) = _1] >> char_('@') >> double_[ref(b) = _1],
space);

Mas agora euAlém disso deseja garantir que o comprimento total da sequência seja analisado comno_nan não excede 4, ou seja, "1,23" ou ".123" ou mesmo "2.e6" ou "inf" está ok, "3,2323" não é nem é "nan". Eu não posso fazer isso noparse_n/parse_frac_n seção da política, que parece separadamente esquerda / direita do ponto e não pode se comunicar (... limpa), o que eles teriam que fazer desde oNo geral comprimento é relevante.

A ideia então era estenderreal_parser (noboost/spirit/home/qi/numeric/real.hpp) eenrole oparse método - mas esta classe não tem métodos. Ao lado dereal_parser é oany_real_parser estrutura quefaz terparse, mas essas duas estruturas não parecem interagir de maneira óbvia.

Existe uma maneira de injetar facilmente meu próprio parse (), fazer algumas pré-verificações e chamar oreal analisar (return boost::spirit::qi::any_real_parser<T, RealPolicy>::parse(...)) que segue as políticas especificadas? Escrever um novo analisador seria um método de último recurso, mas espero que exista uma maneira melhor.

(Usando o Boost 1.55, ou seja, Spirit 2.5.2, com C ++ 11)

questionAnswers(1)

yourAnswerToTheQuestion