#include <iostream>
#include <string>
#include <boost/spirit/include/qi.hpp>

namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;


template <typename T>
struct real_with_separated_sign_policies : boost::spirit::qi::real_policies<T>
{
	// allow skipping chars between a possible sign and a folling real number
	template <typename Iterator>
	static bool parse_sign(Iterator& first, Iterator const& last)
	{
		bool ret = qi::extract_sign(first, last);
		if (ret)
			qi::parse(first, last, *qi::lit(' '));
		return ret;
	}
};


template <typename Iterator, typename Skipper>
struct RealWithSeparatedSignParser
	: qi::grammar<Iterator, double(), Skipper>
{
	boost::spirit::qi::real_parser<double, real_with_separated_sign_policies<double> > RealWithSeparatedSignValue;

	RealWithSeparatedSignParser() : RealWithSeparatedSignParser::base_type(start)
	{
		start %= RealWithSeparatedSignValue;
	}

	qi::rule<Iterator, double(), Skipper> start;
};

int main() {
	std::string str = " -  1.234 ";
	std::string::const_iterator it = str.begin();
	std::string::const_iterator endIt = str.end();
	RealWithSeparatedSignParser<std::string::const_iterator, ascii::space_type> grammar;
	double realWithSeparatedSign;
	bool ret = phrase_parse(it, endIt, grammar, ascii::space, realWithSeparatedSign);
	std::cout << ret << " " << realWithSeparatedSign;
	return 0;
}
