/ / C'è un modo per evitare di dover istanziare molti modelli in molti file? - c ++, modelli, cuda, istanziazione

C'è un modo per evitare di dover istanziare molti modelli in molti file? - c ++, modelli, cuda, istanziazione

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 № 1

Dare 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.