Сопоставление грамматики 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>));
}

Как мне создать грамматику, соответствующую определенному типу?

EDIT:

Похоже, что proto :: _ и proto :: N не используются в качестве подстановочных знаков в пользовательских типах. Код действительно компилируется с этой грамматикой (утверждение соответствует проходит):

struct test:
    proto::terminal<vector<float, 2> >
{};

Но не работает, когда любой из подстановочных знаков находится в типе:

struct test:
    proto::terminal<vector<float, N> >
{};

Или:

struct test:
    proto::terminal<vector<_, 2> >
{};

Итак, если я могу Мои собственные типы не используют подстановочные знаки, как я могу проверить, является ли выражение терминалом, содержащим вектор?

10
задан Charles 25 June 2011 в 22:55
поделиться