Restringir el Boost.Spirit existente real_parser (con una política)

Quiero analizar un flotante, pero no permitir valores NaN, por lo que genero una política que hereda de la política predeterminada y creo unreal_parser con eso:

// 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);

Pero ahora yoademás desea asegurarse de que la longitud total de la cadena analizada conno_nan no excede 4, es decir, "1.23" o ".123" o incluso "2.e6" o "inf" está bien, "3.2323" no lo es, ni es "nan". No puedo hacer eso en elparse_n/parse_frac_n sección de la política, que se ve por separado a la izquierda / derecha del punto y no se puede comunicar (...limpiamente), que tendrían que hacerlo desde elen general La longitud es relevante.

La idea entonces era extenderreal_parser (enboost/spirit/home/qi/numeric/real.hpp) yenvolver elparse método - Pero esta clase no tiene métodos. Cerca dereal_parser es elany_real_parser estructura quehace tenerparse, pero estas dos estructuras no parecen interactuar de manera obvia.

¿Hay alguna manera de inyectar fácilmente mi propio análisis (), hacer algunas comprobaciones previas y luego llamar alreal analizar (return boost::spirit::qi::any_real_parser<T, RealPolicy>::parse(...)) que se adhiere a las políticas dadas? Escribir un nuevo analizador sería un método de último recurso, pero espero que haya una mejor manera.

(Usando Boost 1.55, es decir, Spirit 2.5.2, con C ++ 11)

Respuestas a la pregunta(1)

Su respuesta a la pregunta