Estoy tratando de hacer una gramática en Boost.Proto que coincida con un tipo de vector, pero cuando le doy un terminal de ese tipo, no coincide con la gramática. La definición de tipo se parece a esto:Coincidencia de una gramática Boost.Proto con un tipo
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];
};
La gramática que estoy tratando de llegar a coincidir ve algo como esto:
namespace proto = boost::proto;
using proto::_;
using proto::N;
struct test:
proto::terminal<vector<_, N> >
{};
la comparación falla:
int main()
{
BOOST_MPL_ASSERT((proto::matches<proto::terminal<vector<float, 2> >::type, test>));
}
Cómo hacer yo hacer una gramática que coincida con un tipo específico?
EDIT:
Parece que proto :: _ y proto :: N no está siendo utilizado como un comodín en los tipos personalizados. El código se compila con esta gramática (el matches
afirmación pasa):
struct test:
proto::terminal<vector<float, 2> >
{};
Pero no funciona cuando uno de los comodines se encuentran en el tipo:
struct test:
proto::terminal<vector<float, N> >
{};
O:
struct test:
proto::terminal<vector<_, 2> >
{};
Entonces, si no puedo usar mis propios tipos de comodines, ¿cómo puedo probar si la expresión es un terminal que contiene un vector?
Intentando lo mismo en una clase de matriz multi-D personalizada. Me pregunto si es mejor adaptar proto a mi clase, o mi clase a proto. Intento seguir el primer camino, ya que no quiero estropear muchas cosas que ya funcionan, pero no estoy seguro – Giuliano