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


144

So che è possibile far funzionare un modello:

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

ed è possibile creare una classe modello:

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

ma è possibile rendere una classe non all'interno di un modello e quindi trasformare una funzione in quella classe in un 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 è?

Risposte:


115

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


3
E anche che non puoi specializzarli. :-(
Frank Krueger,

7
Non esattamente vero La definizione può essere in un file cpp, purché venga chiamata una volta per ogni n-uplet di parametro modello univoco da una funzione / metodo non modello dopo che è stata definita.
Benoît,

1
Quindi il mio "dovrebbe" - tenerlo nell'intestazione è il modo più semplice per farlo.
Non sono sicuro il

4
In realtà, credo che tu possa specializzarli esplicitamente, ma non puoi specializzarli parzialmente. Sfortunatamente non so se si tratta di un'estensione specifica del compilatore o di uno standard C ++.
Patrick Johnmeyer,

7
In realtà è standard c ++. Puoi fare struct A {template <typename> void f (); }; template <> void A :: f <int> () {} per esempio. Non puoi specializzarli in ambito di classe, ma puoi farlo bene se fatto in ambito di spazio dei nomi. (da non confondere con l'ambito in cui la specializzazione è effettivamente inserita: la specializzazione sarà ancora un membro della classe - ma la sua definizione viene fatta nell'ambito del namespace. Spesso l'ambito in cui viene inserito qualcosa è uguale all'ambito qualcosa è definito in - ma a volte ciò non è vero, come in tutti i casi di definizioni fuori classe)
Johannes Schaub - litb

70

Vedi qui: Modelli , metodi dei modelli , Modelli dei membri, Modelli delle funzioni dei membri

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];
}

buon esempio. ma perché il template <typename T> è all'interno della classe definitino ... ???
Martian2049

@ Martian2049 Credo che sia così che il modello si applica solo alla funzione membro all'interno della classe e non alla classe nel suo insieme. Esattamente come richiesto dal PO.
CBK,

21

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.


9

Il modo più semplice è inserire la dichiarazione e la definizione nello stesso file, ma può causare file eseguibili di dimensioni eccessive. Per esempio

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

Inoltre, è possibile inserire la definizione del modello in 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 <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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.