我已经实现了一个半边缘数据结构作为模板库。原因是,我不得不将这个库从glm移植到本征,然后我不得不将其扩展到任意维度,但仅限于3D。
因此,我发誓永远不会为了有一半的优势而乏味地到处改变类型。
然而,尽管我的半边缘按预期运行和执行,但它是一个很大的头,它占用了我在任何包含它的文件上30%左右的编译时间。
令人沮丧的是,也许图书馆80%的工作完全不知道几何数据是什么
总体概述类似
template<typename Data>
class HalfMesh
{
vector<Data> data;
vector<HalfEdge> verts;
vector<HalfEdge> edges;
vector<Face> faces;
void SomeMethod(){/* uses only verts, edges, and faces */}
};
在这个场景中,verts, edges, faces
都是非模板化的类,这个结构所做的80%涉及这3个类,而不是Data
。
我想减少编译时间,所以理想情况下,我想将一些成员方法向下移动到cpp文件中,并移出标头。
是否有一些语法可以告诉c++";所有这些函数对于任何模板都是相同的,链接到一个cpp文件,让我把实现从头中移出"?
创建一个非模板基类,并将不依赖于模板参数的所有内容移动到它。它的函数可以在.cpp文件中实现。
"pimpl"技术是另一种有助于缩短编译时间的方法。
https://en.cppreference.com/w/cpp/language/pimpl
// ------------- half_mesh.h --------------------------
template <typename Data>
class HalfMesh {
private:
vector<Data> data;
std::unique_ptr<HalfMeshImpl> impl;
public:
inline void SomeMethod() {
impl->SomeMethod();
}
};
// ------------- half_mesh_impl.h --------------------------
class HalfMeshImpl {
private:
vector<HalfEdge> verts;
vector<HalfEdge> edges;
vector<Face> faces;
public:
void SomeMethod();
};
// ------------- half_mesh_impl.cc --------------------------
void HalfMeshImpl::SomeMethod() {
}