C++-对任何类型的模板类都使用相同的静态方法
C++ - same static method for any type of a template class
我有两个模板化类,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++风格。
相关文章:
- 尝试了解在导入的静态方法上使用删除方法时的错误
- 如何通过命名空间调用非静态方法
- 如何在没有实例的情况下获取非静态方法的类型?
- 调用从模板派生的类的静态方法,而不指定模板
- 如何在 c++ 中异步调用静态方法?
- C++ 将静态方法转换为简单方法
- 从另一个标头中的标头调用静态方法
- C++中静态方法的局部变量范围
- 如何启用使用另一个类的静态方法的模板函数的自动推导,从而消除冗长的调用方代码
- 使用本机 JNI 静态方法实现C++ Java 运行时错误
- 当只有静态方法受到影响时,如何解决C++中的链接器错误?
- 静态变量在同一个翻译单元中被静态方法使用时是否保证被初始化?
- 为什么链接器报告全局函数的乘法定义符号,而不是类静态方法
- 从部分专用模板方法调用模板非静态方法
- 如何使用 c++ 在 cocos2dx 中定义非静态方法
- 使用 CMake 的静态方法链接错误
- 在子类上调用模板化静态方法时获取类的类型名
- 仅具有公共静态方法的帮助程序类
- C++-对任何类型的模板类都使用相同的静态方法
- 使用std::函数从任何对象调用非静态方法