#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
namespace qi = boost:: spirit :: qi ;
enum numeric_types
{
fmt_none,
fmt_float,
fmt_double,
fmt_uint,
fmt_int,
// fmt_hex, etc.
} ;
template < typename It>
bool is_numeric( It& f, It l, numeric_types& detected)
{
return qi:: phrase_parse ( f,l,
qi:: uint_ [ qi:: _val = fmt_uint ]
| qi:: int_ [ qi:: _val = fmt_int ]
| qi:: float_ [ qi:: _val = fmt_float ]
| qi:: double_ [ qi:: _val = fmt_double ]
,qi:: space , detected) ;
}
template < typename It>
bool is_numeric( It& f, It l)
{
numeric_types detected = fmt_none;
return is_numeric( f, l, detected) ;
}
int main( )
{
const std:: string input = "124, -25, 582" ;
std:: string :: const_iterator it = input.begin ( ) ;
bool ok = is_numeric( it, input.end ( ) ) ;
if ( ok)
{
std:: cout << "parse success\n " ;
if ( it! = input.end ( ) )
std:: cerr << "trailing unparsed: '" << std:: string ( it,input.end ( ) ) << "'\n " ;
}
else
std:: cerr << "parse failed: '" << std:: string ( it,input.end ( ) ) << "'\n " ;
return ok? 0 : 255 ;
}
I2luY2x1ZGUgPGJvb3N0L3NwaXJpdC9pbmNsdWRlL3FpLmhwcD4KI2luY2x1ZGUgPGJvb3N0L3NwaXJpdC9pbmNsdWRlL3Bob2VuaXguaHBwPgpuYW1lc3BhY2UgcWkgPSBib29zdDo6c3Bpcml0OjpxaTsKCmVudW0gbnVtZXJpY190eXBlcwp7CiAgICBmbXRfbm9uZSwKICAgIGZtdF9mbG9hdCwKICAgIGZtdF9kb3VibGUsCiAgICBmbXRfdWludCwKICAgIGZtdF9pbnQsCiAgICAvLyBmbXRfaGV4LCBldGMuIAp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIEl0PgogICAgYm9vbCBpc19udW1lcmljKEl0JiBmLCBJdCBsLCBudW1lcmljX3R5cGVzJiBkZXRlY3RlZCkKewogICAgcmV0dXJuIHFpOjpwaHJhc2VfcGFyc2UoZixsLAogICAgICAgICAgICBxaTo6dWludF8gICBbIHFpOjpfdmFsID0gZm10X3VpbnQgICBdCiAgICAgICAgICB8IHFpOjppbnRfICAgIFsgcWk6Ol92YWwgPSBmbXRfaW50ICAgIF0KICAgICAgICAgIHwgcWk6OmZsb2F0XyAgWyBxaTo6X3ZhbCA9IGZtdF9mbG9hdCAgXQogICAgICAgICAgfCBxaTo6ZG91YmxlXyBbIHFpOjpfdmFsID0gZm10X2RvdWJsZSBdCiAgICAgICAgICAgLHFpOjpzcGFjZSwgZGV0ZWN0ZWQpOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgSXQ+CiAgICBib29sIGlzX251bWVyaWMoSXQmIGYsIEl0IGwpCnsKICAgIG51bWVyaWNfdHlwZXMgZGV0ZWN0ZWQgPSBmbXRfbm9uZTsKICAgIHJldHVybiBpc19udW1lcmljKGYsIGwsIGRldGVjdGVkKTsKfQoKaW50IG1haW4oKQp7CiAgICBjb25zdCBzdGQ6OnN0cmluZyBpbnB1dCA9ICIxMjQsIC0yNSwgNTgyIjsKICAgIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdCA9IGlucHV0LmJlZ2luKCk7CgogICAgYm9vbCBvayA9IGlzX251bWVyaWMoaXQsIGlucHV0LmVuZCgpKTsKCiAgICBpZiAob2spICAgCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJwYXJzZSBzdWNjZXNzXG4iOwogICAgICAgIGlmIChpdCE9aW5wdXQuZW5kKCkpIAogICAgICAgICAgICBzdGQ6OmNlcnIgPDwgInRyYWlsaW5nIHVucGFyc2VkOiAnIiA8PCBzdGQ6OnN0cmluZyhpdCxpbnB1dC5lbmQoKSkgPDwgIidcbiI7CiAgICB9CiAgICBlbHNlIAogICAgICAgIHN0ZDo6Y2VyciA8PCAicGFyc2UgZmFpbGVkOiAnIiA8PCBzdGQ6OnN0cmluZyhpdCxpbnB1dC5lbmQoKSkgPDwgIidcbiI7CgogICAgcmV0dXJuIG9rPyAwIDogMjU1Owp9Cg==
compilation info
prog.cpp: In function ‘bool is_numeric(It&, It, numeric_types&)’:
prog.cpp:19: error: ‘uint_’ is not a member of ‘qi’
prog.cpp:19: error: ‘_val’ is not a member of ‘qi’
prog.cpp:20: error: ‘int_’ is not a member of ‘qi’
prog.cpp:20: error: ‘_val’ is not a member of ‘qi’
prog.cpp:21: error: ‘float_’ is not a member of ‘qi’
prog.cpp:21: error: ‘_val’ is not a member of ‘qi’
prog.cpp:22: error: ‘double_’ is not a member of ‘qi’
prog.cpp:22: error: ‘_val’ is not a member of ‘qi’
prog.cpp:23: error: ‘space’ is not a member of ‘qi’
stdout