这个为什么不用模板?
从OpenSceneGraph看到的代码片段,相当凶残。这是两个4x4的矩阵类,区别在于单精度或者双精度浮点。
为什么不用template呢?
Matrixf.h:
- C/C++ code
class Matrixf {public: typedef float value_type; Matrixf(); virtual ~Matrixf(); value_type foo(); value_type bar(); value_type _data[16];};
然后是双精度的头Matrixd.h:
- C/C++ code
class Matrixd {public: typedef double value_type; Matrixd(); virtual ~Matrixd(); value_type foo(); value_type bar(); value_type _data[16];};
然后凶残的来了:
Matrix_implementation.cpp
- C/C++ code
value_type Matrix_implementation::foo() { // work with value_type}value_type Matrix_implementation::bar() { // work with value_type}
Matrixf.cpp:
- C/C++ code
#include "Matrixf.h"#define Matrix_implementation Matrixf#include "Matrix_implementation.cpp"
Matrixd.cpp:
- C/C++ code
#include "Matrixd.h"#define Matrix_implementation Matrixd#include "Matrix_implementation.cpp"
[解决办法]
还可以,不是很暴力.正常的写法.
不用模板应该是因为这是年代久远的代码,那时候对模板支持不好,例如vc6
[解决办法]
一些开源代码比较注重跨平台特性,考虑到一些平台(特别是嵌入式的)对模板支持的不是很好,所以谨慎使用。而且这种写法的开销似乎更小一点。特别底层的一些运算也不太青睐STL的东西
[解决办法]
那LZ可以看看里面的实现是否想相同了。虽然没看过,不过估计应该实现是不一样的。
[解决办法]
如果类型不同时,各类型的成员函数的算法实现不一样的话就不适合使用类模板了,非要使用模板的话只能将每个不适合使用泛型类型的成员函数再进行特化
[解决办法]
算法实现不一样可以用带冗余参数的模板特化来控制版本。(C++11还可以用using template和inline namespace配合。)但这样做对维护人员技巧要求略高,考虑编译效率和接口复杂性,也不一定合算。