加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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<_,_> > 
    >));
}

希望有帮助!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读