2011-05-16 57 views
4

我正在重構一個打字系統(類型模型)我已經在使用精靈進行字符串序列化了。我正在使用類型特徵的編譯時建模結構。助推精神:內置終端應使用什麼類型的名稱?

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工作,但就是因爲(住宅/氣/數字/ 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> > 
     {}; 
    } 

字符串類型定義無法正常工作,而且也不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規則,語法,原語解析器?

注:我已經開始致力於給我所有的「類型」一個函數封裝一個規則,然後將其作爲一個類型特徵。

回答

1

我不知道它會在所有的情況下工作,但我做了什麼,以我的typedef船長是使用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; 

有可能是一個更好/更優雅的方式,但它目前適用於我所需要的。