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

希望有帮助!

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...