Come creare una funzione template all’interno di una class? (C ++)

So che è ansible creare una funzione template:

template void DoSomeThing(T x){} 

ed è ansible creare una class template:

 template class Object { public: int x; }; 

ma è ansible rendere una class non all’interno di un modello e quindi creare una funzione in quella class come modello? Vale a dire:

 //I have no idea if this is right, this is just how I think it would look class Object { public: template void DoX(){} }; 

o qualcosa nella misura in cui la class non fa parte di un modello, ma la funzione è?

La tua ipotesi è quella giusta. L’unica cosa che devi ricordare è che la definizione del modello di funzione membro (oltre alla dichiarazione) dovrebbe essere nel file di intestazione, non in cpp, sebbene non debba trovarsi nel corpo della dichiarazione di class stessa.

Vedi qui: Modelli , metodi modello , Modelli membri, Modelli funzione membro

 class Vector { int array[3]; template  void eqAdd(TVECTOR2 v2); }; template  void Vector::eqAdd(TVECTOR2 a2) { for (int i(0); i < 3; ++i) array[i] += a2[i]; } 

Sì, le funzioni dei membri del modello sono perfettamente legali e utili in numerose occasioni.

L’unica avvertenza è che le funzioni dei membri del modello non possono essere virtuali.

Il modo più semplice è inserire la dichiarazione e la definizione nello stesso file, ma può causare file excutable sovradimensionati. Per esempio

 class Foo { public: template  void some_method(T t) {//...} } 

Inoltre, è ansible inserire la definizione del modello nei file separati, ovvero inserirli in file .cpp e .h. Tutto quello che devi fare è includere esplicitamente l’istanza del modello nei file .cpp. Per esempio

 // .h file class Foo { public: template  void some_method(T t); } // .cpp file //... template  void Foo::some_method(T t) {//...} //... template void Foo::some_method(int); template void Foo::some_method(double);