是否有一种方法可以避免在大量文件中实例化大量模板

Is there a way avoid having to instantiate a lot of templates in a lot of files?

本文关键字:文件 实例化 可以避免 方法 一种 是否      更新时间:2023-10-16

我正在编写可以利用函子的cuda内核,这些函子作为模板的参数传递。例如:

template<typename Functor> void myKernel(float arg1, float* arg2, Functor f) {
  // Do stuff that will involve f
}

这些函子是在头文件中定义的,我将其包含在每个cpp文件中,对于每个文件,我必须用所有的函子实例化所有的内核:

template<> myKernel<Add>(float, float*, Add)
template<> myKernel<Sub>(float, float*, Sub)

这是大量的代码重复,我们必须记住为每个新的函函数添加新的行。有没有办法一次性定义这一切?

看看extern template declarations.

关于外部模板有一些微妙的细节,特别是14.7.2.10:

除了内联函数和类模板特化之外,显式实例化声明具有抑制它们所指向的实体的隐式实例化。

这意味着下面的语句只会抑制非内联成员函数f在其他翻译单元中的实例化,而不会抑制g的实例化:

template<typename T> class A {
public:
     void g() {} // inline member function
     void f();
};
template<typename T> void A::f() {} // non-inline

只需在头文件中添加实例化,您就不必每次都记得指定它们。