仅标头模板的显式实例化声明(extern模板)

时间:2017-01-26 11:38:11

标签: c++ c++11 templates extern

我正在努力加快GLM(OpenGL数学)的编译时间。 GLM大量使用C ++模板。

这是我到目前为止所尝试过的。

math.h
#pragma once

#include <glm\glm.hpp>
extern template struct glm::tvec3<float, glm::highp>;
math.cpp
#include "math.h"
template struct glm::tvec3<float, glm::highp>;

然后我有三个使用glm::vec3模板的文件,glm::vec3glm::tvec3<float, glm::highp>的typedef。三个文件a,b,c看起来几乎相同:

a.cpp, b.cpp, c.cpp
#include "math.h"
glm::vec3 func() {
    glm::vec3 a = glm::vec3{1,1,1};
    glm::vec3 b = glm::vec3{1,1,1};
    return a + b;
}

我正在使用显式实例化定义和显式实例化声明。因此文件a,b,c不应导致隐式实例化。 但编译时间与我不这样做的时间相同。

1 个答案:

答案 0 :(得分:0)

您的math.h仍然会导致用户包含&lt; glm \ glm.hpp&gt;
这是你想要避免加快速度的事情。为了加快速度,创建自己的类,其实现(在math.cpp中)可能使用glm.hpp,但该类的用户不需要自己包含glm.hpp。

这是留给学生的一个例子,但你需要这样的东西:

math.h中
struct vec3 {double x1,x2,x3};
vec3 plus(const vec3&amp; a,const vec3&amp; b);

然后当a.cpp包含math.h时,它提供了你需要的函数,但不会使你的所有编译单元都包含glm.hpp。