我正在重构一个使用 Spirit 进行字符串序列化的打字系统(类型模型)。我正在使用类型特征的编译时建模构造。
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; } \
/***/
这意味着我不能 typedef 它,它是一个原型终端构造,或者不透明地,一个 const 全局定义。
我的问题:我如何 typedef 规则、语法、原始解析器?
注意:我已经开始为我所有的“类型”提供一个封装规则的函子,然后将其作为类型特征。