そういえば、ぼくはテクノロジストなのだった。どれくらいのひとびとが vecmath-C++ を使っているのか判らないけれど(boost::is_base_and_derived を使って、Tuple のあたりをすっきりさせたりするといいかも)。GVector, GMatrix の実装は川地氏のところから。

#ifndef VECMATH_TARITS_HPP
#define VECMATH_TARITS_HPP

#include <vecmath.h>

template <typename T>
class vecmath_traits {
public:
static const bool is_vecmath = false;
static const bool is_tuple = false;
static const bool is_matrix = false;
static const bool is_gvector = false;
static const bool is_gmatrix = false;
};

#define VECMATH_TRAITS_PSP(TYPE, IS_TUPLE, IS_MATRIX, IS_GVECTOR, IS_GMATRIX) \
template <typename T> \
class vecmath_traits< VM_VECMATH_NS :: TYPE<T> > { \
public: \
static const bool is_vecmath = true; \
static const bool is_tuple = IS_TUPLE; \
static const bool is_matrix = IS_MATRIX; \
static const bool is_gvector = IS_GVECTOR; \
static const bool is_gmatrix = IS_GMATRIX; \
};

VECMATH_TRAITS_PSP(Tuple2, true, false, false, false)
VECMATH_TRAITS_PSP(Tuple3, true, false, false, false)
VECMATH_TRAITS_PSP(Tuple4, true, false, false, false)
VECMATH_TRAITS_PSP(AxisAngle4, true, false, false, false)
VECMATH_TRAITS_PSP(Color3, true, false, false, false)
VECMATH_TRAITS_PSP(Color4, true, false, false, false)
VECMATH_TRAITS_PSP(Point2, true, false, false, false)
VECMATH_TRAITS_PSP(Point3, true, false, false, false)
VECMATH_TRAITS_PSP(Point4, true, false, false, false)
VECMATH_TRAITS_PSP(Quat4, true, false, false, false)
VECMATH_TRAITS_PSP(TexCoord2, true, false, false, false)
VECMATH_TRAITS_PSP(Vector2, true, false, false, false)
VECMATH_TRAITS_PSP(Vector3, true, false, false, false)
VECMATH_TRAITS_PSP(Vector4, true, false, false, false)
VECMATH_TRAITS_PSP(Matrix3, false, true, false, false)
VECMATH_TRAITS_PSP(Matrix4, false, true, false, false)
#ifdef GVECTOR_H
VECMATH_TRAITS_PSP(GVectorT, false, false, true, false)
#endif
#ifdef GMATRIX_H
VECMATH_TRAITS_PSP(GMatrixT, false, false, false, true)
#endif

#undef VECMATH_TRAITS_PSP

#endif // VECMATH_TRAITS_HPP