我有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


问题是,如果我正确理解,编译器将创建2个单独的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 ++风格更加一致。

关于c++ - C++-任何类型的模板类的相同静态方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29594551/

10-12 13:50