c – 将Boost.Proto语法与一种类型相匹配
发布时间:2020-12-16 06:44:29 所属栏目:百科 来源:网络整理
导读:我正在尝试在Boost.Proto中匹配一个矢量类型的语法,但是当我给它一个类型的终端,它不符合语法.类型定义如下所示: template typename T,unsigned Dstruct vector{ typedef T scalar; enum { size = D }; scalar operator[](unsigned i) { return m_component
我正在尝试在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<_,_> > >)); } 希望有帮助! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |