Scrivo i kernel di cuda che possono utilizzare i funtori, che vengono passati come parametro con i modelli. Ad esempio:
template<typename Functor> void myKernel(float arg1, float* arg2, Functor f) {
// Do stuff that will involve f
}
Questi funtori sono definiti in un file di intestazione che includo in ciascun file cpp, e per ognuno di essi devo istanziare tutti i kernel con tutti i funtori:
template<> myKernel<Add>(float, float*, Add)
template<> myKernel<Sub>(float, float*, Sub)
Questo è un sacco di duplicazione del codice, e dobbiamo ricordare di aggiungere una nuova linea per ogni nuovo functor. C'è un modo per definire tutto questo una volta?
risposte:
1 per risposta № 1Dare un'occhiata a extern template declarations.
Ci sono alcuni dettagli sottili sui template extern, specialmente 14.7.2.10:
Ad eccezione delle funzioni inline e delle specializzazioni dei modelli di classe, dichiarazioni di istanziazione esplicite hanno l'effetto di sopprimere il istanziazione implicita dell'entità a cui si riferiscono.
Ciò significa che quanto segue sopprimerà l'istanziazione della funzione membro non in linea f in altre unità di traduzione, ma non per g:
template<typename T> class A {
public:
void g() {} // inline member function
void f();
};
template<typename T> void A::f() {} // non-inline
0 per risposta № 2
Basta aggiungere le istanze nel file di intestazione e non dovrai ricordarti di specificarle ogni volta.