我有2个模板化的类,Matrix4x4t和Vector3t,以及Matrix4x4t中的许多静态方法,它们都对它们进行操作。 Matrix4x4t定义如下,包括所述静态方法之一:
template <class T>
class Matrix4x4t
{
public:
T values[16];
...
template <class W, class U, class V>
static void multiply3x3Vector3(const Matrix4x4t<W> &m,
const Vector3t<U> &columnVector,
Vector3t<V> &result);
...
};
multiply3x3Vector3
的想法是采用任何可能类型的矩阵(m)和向量(columnVector),执行乘法,然后将结果存储在向量(结果)中,如果不同则转换为它的类型。这很有效,并允许我执行以下操作:
Matrix4x4t<double> matd;
Vector3t<float> vec3f(1.0f, 2.0f, 3.0f);
Vector3t<int> resulti;
Matrix4x4t<float>::multiply3x3Vector3(matd, vec3f, resulti); //This works
Matrix4x4t<double>::multiply3x3Vector3(matd, vec3f, resulti); //So does this
问题在于,如果我理解正确,编译器将为multiple3x3Vector3
创建2个单独的定义,一个用于Matrix4x4t<int>
,另一个用于Matrix4x4t<double>
,即使它们采用相同的类型和做同样的事情。对于用户来说,当他们产生相同结果时,为什么他们需要为每个呼叫使用特定类型的Matrix4x4t
时,可能还不清楚,如果他们可以调用它们会更好:
Matrix4x4t::multiply3x3Vector3(matd, vec3f, resulti);
两者的解决方案是使multiple3x3Vector3
函数与类本身分开,但我喜欢将它放在Matrix4x4t
的范围内。我可以使用简单地调用外部函数的静态方法,但在我走这条路之前,我想我会问是否有一些我错过的东西可以解决这两个问题并让我把方法保留在类中?
答案 0 :(得分:1)
嗯,这里有一个让所请求的Matrix4x4t::multiply3x3Vector3(matd, vec3f, resulti)
语法正常工作的选项:
template <class T=void>
class Matrix4x4t;
template <>
class Matrix4x4t<void>
{
public:
template <class W, class U, class V>
static void multiply3x3Vector3(const Matrix4x4t<W> &m,
const Vector3t<U> &columnVector,
Vector3t<V> &result);
...
};
template <class T>
class Matrix4x4t // perhaps inherit Matrix4x4t<void>
{
public:
T values[16];
...
};
但是正如5gon12eder所评论的那样,将这些相关的函数放在命名空间中并让它们通过Koenig查找找到它甚至更好,更符合公认的C ++风格。