/ / Чи є спосіб уникнути необхідності створювати багато шаблонів у багатьох файлах? - c ++, шаблони, cuda, екземпляри

Чи існує спосіб уникати необхідності інвенціонування багатьох шаблонів у великій кількості файлів? - C + +, шаблони, cuda, екземпляри

Я пишу ядра 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 в файл заголовка, і ви не повинні пам'ятати, щоб вказати їх кожен раз.