如此便携,我不太可能真的需要将GLM放在包装纸后面,但为了学习,我想知道我是否能够。
我最初喜欢这个快速技巧:
// MyMaths.h
#define GLM_FORCE_CXX03
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
namespace mathspace
{
using Matrix4 = glm::mat4;
}
例如,这允许调用mathspace::Matrix4
而不是glm::mat4
。但后来我意识到这并不能将GLM隐藏在外部文件中。
因此,我考虑了将所有“GLM”放在源文件中同时保持标题不含GLM代码的标准方法。这意味着源文件中的函数可以转换所有内容。 (我考虑过pImpl但是看不到它的需要。)所以设置了几个基础(旋转和[] []操作),标题看起来像这样:
// MyMaths.h
#include "Direction3.h" // My own vec3 of some sort
namespace mathspace
{
void Rotate(Matrix4& matrix, float angle, const Direction3& axis);
class Matrix4
{
private:
float** m_matrix;
public:
Matrix4();
// All this Proxy stuff is to implement a [][] operator.
class Proxy
{
private:
float* m_column;
public:
Proxy(float* column);
float& operator[](int index)
{
return m_column[index];
}
};
Proxy operator[](int index)
{
return Proxy(m_matrix[index]);
}
};
}
这种方法的明显变化是我必须将每个我想要的功能添加到包装器中;在这种情况下,两个重载和Rotate()函数。
但真正的问题(我认为)是表现。说到源文件,这个新的Rotate()函数必须:
..这看起来并不好。
所以,只是重复一遍,这不是关于GLM,而是GLM创建了一个我想学习的例子,问题是:
是否可以在没有性能损失的情况下包装和隐藏GLM?如果是这样,怎么样?