我正在尝试在Boost.Proto中匹配一个矢量类型的语法,但是当我给它一个类型的终端,它不符合语法.类型定义如下所示:
template <typename T,unsigned D> struct vector { typedef T scalar; enum { size = D }; scalar& operator[](unsigned i) { return m_components[i]; } scalar const& operator[](unsigned i) const { return m_components[i]; } private: scalar m_components[size]; };
我想要匹配的语法看起来像这样:
namespace proto = boost::proto; using proto::_; using proto::N; struct test: proto::terminal<vector<_,N> > {};
比赛失败:
int main () { BOOST_MPL_ASSERT((proto::matches<proto::terminal<vector<float,2> >::type,test>)); }
如何制作符合特定类型的语法?
编辑:
看起来,proto :: _和proto :: N在自定义类型中不被用作通配符.代码使用此语法进行编译(匹配断言通过):
struct test: proto::terminal<vector<float,2> > {};
但是当任何一个通配符的类型为:
struct test: proto::terminal<vector<float,N> > {};
要么:
struct test: proto::terminal<vector<_,2> > {};
所以如果我不能使用我自己的类型的通配符,我该如何测试表达式是否包含一个向量的终端?
解决方法
Boost.Proto不适用于非类型模板参数.如果可以的话,把你的矢量类型改成使用整型的包装器,像这样:
template <typename T,typename D> struct vector { typedef T scalar; enum { size = D::value }; scalar& operator[](unsigned i) { return m_components[i]; } scalar const& operator[](unsigned i) const { return m_components[i]; } private: scalar m_components[size]; };
那么你应该能够匹配如下:
int main () { BOOST_MPL_ASSERT((proto::matches< proto::terminal<vector<float,mpl::int_<2> > >::type,proto::terminal<vector<_,_> > >)); }
希望有帮助!