Domanda Come creare una funzione template all'interno di una classe? (C ++)


So che è possibile creare una funzione template:

template<typename T>
void DoSomeThing(T x){}

ed è possibile creare una classe template:

template<typename T>
class Object
{
public:
    int x;
};

ma è possibile rendere una classe non all'interno di un modello e quindi creare una funzione in quella classe 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<class T>
    void DoX(){}
};

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


124
2018-06-09 19:50


origine


risposte:


La tua ipotesi è quella giusta. L'unica cosa che devi ricordare è che il modello di funzione membro definizione (oltre alla dichiarazione) dovrebbe essere nel file di intestazione, non nel cpp, sebbene lo faccia non deve essere nel corpo della dichiarazione di classe stessa.


94
2018-06-09 19:59



Vedere qui: Modelli, metodi modello, Modelli membro, Modelli funzione membro

class   Vector
{
  int     array[3];

  template <class TVECTOR2> 
  void  eqAdd(TVECTOR2 v2);
};

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

60
2018-06-09 19:54



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.


17
2018-06-11 18:10



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 <typename T> void some_method(T t) {//...}
}

Inoltre, è possibile inserire la definizione del modello nei file separati, ossia 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 <typename T> void some_method(T t);
}

// .cpp file
//...
template <typename T> void Foo::some_method(T t) 
{//...}
//...

template void Foo::some_method<int>(int);
template void Foo::some_method<double>(double);

0
2017-07-31 06:09