C++-对任何类型的模板类都使用相同的静态方法

C++ - same static method for any type of a template class

本文关键字:静态方法 任何 类型 C++-      更新时间:2023-10-16

我有两个模板化类,Matrixx4x4t和Vector3t,以及Matrixx4X4t中的许多静态方法,它们都对它们进行操作。Matrixx4x4t定义如下,其中包括一种静态方法:

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),执行乘法,然后将结果存储在向量(result)中,如果不同,则转换为其类型。这工作得很好,并允许我做以下事情:

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的两个单独定义,一个用于Matrix4x4t<int>,另一个用于Matrix4x4t<double>,即使它们采用相同的类型并做相同的事情。用户可能也不清楚,当他们产生相同的结果时,为什么他们需要为每个调用使用特定类型的Matrix4x4t,如果他们可以调用会更好

Matrix4x4t::multiply3x3Vector3(matd, vec3f, resulti);

两者的解决方案都是将multiple3x3Vector3作为一个与类本身分离的函数,但我喜欢将它放在Matrix4x4t的范围内。我可以有简单地调用外部函数的静态方法,但在我走这条路之前,我想我会问,是否有我缺少的东西可以解决这两个问题,并让我将方法保留在类中?

好吧,这里有一个选项可以使请求的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++风格。