c – 将Boost.Proto语法与一种类型相匹配

前端之家收集整理的这篇文章主要介绍了c – 将Boost.Proto语法与一种类型相匹配前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试在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<_,_> > 
    >));
}

希望有帮助!

原文链接:https://www.f2er.com/c/113267.html

猜你在找的C&C++相关文章