如果模板参数只能假设一组有限(且很小)的值,则可以将其定义移至源文件中,并使用显式实例化。
例如,aaa.h
您仅声明模板函数f
和g
:
template <int n>
int f();
template <class T>
void g(int a);
假定n
模板参数只能是1,3,6,和T
模板参数只能是int
,long
和void *
。
然后,您可以这样定义它们aaa.cpp
:
template <int n>
int f()
{
...
}
template <class T>
void g(int a)
{
...
}
template int f<1>();
template int f<3>();
template int f<6>();
template void g<int>(int a);
template void g<long>(int a);
template void g<void *>(int a);
这样,编译器将在编译时为给定参数实例化模板aaa.cpp
。编译客户端代码时,它假定定义存在于某处,并且链接程序将进行处理。
#include "aaa.h"
int main()
{
f<1>();
f<3>();
f<6>();
g<int>(5);
g<long>(5);
g<void *>(5);
}
您也可以显式实例化模板类。缺点是您不能使用f
或g
与其他模板参数一起使用。
#include "aaa.h"
int main()
{
f<5>();
}
结果是
undefined reference to `int f<5>()'
我在一个项目中使用了此技术,在该项目中,很少有复杂的类依赖于小的(<10)整数模板参数集,并且显着减少了编译时间(因为编译器在编译客户端代码时不必解析复杂的模板定义)。 。当然,根据实际代码,您可能会得到较少的改进。