Я пишу ядра 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)
Це багато дублювання коду, і ми повинні пам'ятати про те, щоб додати новий рядок для кожного нового функтора. Чи є спосіб визначити все це один раз?
Відповіді:
1 для відповіді № 1Подивись на extern template declarations.
Є деякі тонкі деталі про шаблони extern, особливо 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
0 для відповіді № 2
Просто додайте instanciations в файл заголовка, і ви не повинні пам'ятати, щоб вказати їх кожен раз.