是否可以将非模板逻辑移到标头之外

  • 本文关键字:是否 c++ templates compilation
  • 更新时间 :
  • 英文 :


我已经实现了一个半边缘数据结构作为模板库。原因是,我不得不将这个库从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() {
}

相关内容

  • 没有找到相关文章

最新更新