c – 提升精神:内置终端应使用哪些类型的名称?
发布时间:2020-12-16 06:56:28 所属栏目:百科 来源:网络整理
导读:我正在重构一个使用精神进行字符串序列化的打字系统(类型模型).我正在使用类型特征的编译时建模构造. templatetype_traitsint4_type{ typedef boost::spirit::qi::int_parserboost::int32_t string_parser;} templatetype_traitsstring_type{ typedef boost:
我正在重构一个使用精神进行字符串序列化的打字系统(类型模型).我正在使用类型特征的编译时建模构造.
template<> type_traits<int4_type> { typedef boost::spirit::qi::int_parser<boost::int32_t> string_parser; } template<> type_traits<string_type> { typedef boost::spirit::ascii::string string_parser; } 在这个例子中,我展示了原始解析器,但我希望也可以使用规则. int4类型有效,但这是因为(home / qi / numeric / int.hpp 27): namespace tag { template <typename T,unsigned Radix,unsigned MinDigits,int MaxDigits> struct int_parser {}; } namespace qi { /////////////////////////////////////////////////////////////////////// // This one is the class that the user can instantiate directly in // order to create a customized int parser template <typename T = int,unsigned Radix = 10,unsigned MinDigits = 1,int MaxDigits = -1> struct int_parser : spirit::terminal<tag::int_parser<T,Radix,MinDigits,MaxDigits> > {}; } 字符串typedef不起作用,eps也不起作用.我无法弄清楚为什么要引用字符串解析器.然而,在eps的情况下,它归结为: #define BOOST_SPIRIT_TERMINAL(name) namespace tag { struct name {}; } typedef boost::proto::terminal<tag::name>::type name##_type; name##_type const name = {{}}; inline void silence_unused_warnings__##name() { (void) name; } /***/ 这意味着我不能输入它,它是一个proto终端构造,或者不透明地,一个const全局定义. 我的问题:我如何输入规则,语法,原语解析器? 注意:我已经开始致力于为我的所有“类型”提供封装规则的仿函数,然后将其作为类型特征. 解决方法
我不确定它是否会在所有情况下都有效,但我对typedef我的Skipper所做的是使用BOOST_TYPEOF:
typedef BOOST_TYPEOF(boost::spirit::ascii::space - (boost::spirit::qi::eol | boost::spirit::qi::eoi)) SkipperT; 所以你的例子就是 typedef BOOST_TYPEOF(boost::spirit::ascii::string) string_parser; 可能有更好/更优雅的方式,但它目前适用于我需要它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |