gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:19:14 26 4
gpt4 key购买 nike

我有 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)和 vector (columnVector),执行乘法,然后将结果存储在 vector (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

问题是,如果我理解正确,编译器将创建 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++ - 任何类型的模板类的相同静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29594551/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com