Я пытаюсь сделать грамматику в 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 не используются в качестве подстановочных знаков в пользовательских типах. Код компилируется с помощью этой грамматики (утверждение matches
):
struct test:
proto::terminal<vector<float, 2> >
{};
Но не работает, если в типе есть одна из подстановочных знаков:
struct test:
proto::terminal<vector<float, N> >
{};
Или:
struct test:
proto::terminal<vector<_, 2> >
{};
Итак, если я не могу использовать подстановочные знаки для своих собственных типов, как я могу проверить, является ли выражение терминами, содержащими вектор?