Impulsione o espírito usando variáveis locais

Gostaria de definir uma regra com base em um valor analisado anteriormente, i. e a sequência de entrada tem a seguinte estrutura:D <double number> ouI <integer number>. Eu mantenho em uma variável booleana local se o primeiro caractere de leitura éD ouI. O código completo é:

#define BOOST_SPIRIT_USE_PHOENIX_V3
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <string>

namespace qi = boost::spirit::qi;
namespace spirit = boost::spirit;
namespace ascii = boost::spirit::ascii;
using boost::phoenix::ref;

template <typename Iterator>
struct x_grammar : public qi::grammar<Iterator, std::string(), ascii::space_type>
{
public:
    x_grammar() : x_grammar::base_type(start_rule, "x_grammar")
    {
        using namespace qi;
        bool is_int = false;
        start_rule = lit("I")[ref(is_int) = true] | lit("D")[ref(is_int) = false] > digit_rule;
        if(ref(is_int)()) {
            digit_rule = int_[std::cout << "int " << _1 << ".\n"];
        } else {
            digit_rule = double_[std::cout << "double " << _1 << ".\n"];
        }
    }
private:
    qi::rule<Iterator, std::string(), ascii::space_type> start_rule;
    qi::rule<Iterator, std::string(), ascii::space_type> digit_rule;
};

int main()
{
    typedef std::string::const_iterator iter;
    std::string storage("I 5");
    iter it_begin(storage.begin());
    iter it_end(storage.end());
    std::string read_data;
    using boost::spirit::ascii::space;
    x_grammar<iter> g;
    try {
        bool r = qi::phrase_parse(it_begin, it_end, g, space, read_data);
        if(r) {
            std::cout << "Pass!\n";
        } else {
            std::cout << "Fail!\n";
        }
    } catch (const qi::expectation_failure<iter>& x) {
        std::cout << "Fail!\n";
    }
    return 0;
}                                                                                                                                                    

A saída é:double Pass! !! Também não reconhece aif instrução, nem imprime o número analisado!

Nota: Eu sei que existem outras maneiras simples de analisar o exemplo acima. A string real que tenho que analisar parece bastante complicada, e este exemplo apenas ilustra o que eu quero alcançar. O objetivo geral é usar variáveis locais e definir outras regras com base nessas variáveis.

Eu usei as versões 4.6.1 e Boost 1.55.

questionAnswers(1)

yourAnswerToTheQuestion