C
Variante, bei der das allgemeine Template ein Aggregat bleibt.
template <typename T, std::size_t N>
struct vec_generic
{
T v[N];
...
};
template <typename T>
struct vec3 : vec_generic<T, 3>
{
vec3();
vec3(T, T, T);
...
};
template <typename T, std::size_t N>
struct vec_
{
typedef vec_generic<T, N> type;
};
template <typename T>
struct vec_<T, 3>
{
typedef vec3<T> type;
};
Verwendung dann mit vec_<T,N>::type oder wenn Aliastemplates zur Verfügung stehen:
template <typename T, std::size_t N>
using vec = vec_<T, N>::type;
Optionaler Konstruktor:
template <typename T, std::size_t N>
struct vec
{
T v[N];
vec();
template <typename U, typename V, typename W>
vec(U, V, W, typename boost::enable_if<typename boost::mpl::and_<boost::mpl::bool_<boost::is_convertible<U, T>::type::value
&& boost::is_convertible<V, T>::type::value
&& boost::is_convertible<W, T>::type::value>, boost::mpl::bool_<N==3>>::type>::type* = 0);
// mit C++11
template <std::size_t I = N, typename std::enable_if<I==3, int>::type = 0>
vec(T, T, T);
// mit C++11 allgemein
template <typename... U, typename std::enable_if<sizeof...(U)==N, int>::type = 0>
vec(U&&... u) : v{ std::forward<U>(u)... } {}
};