web-dev-qa-db-fra.com

Comment créer une fonction modèle dans une classe? (C++)

Je sais qu'il est possible de créer une fonction de modèle:

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

et il est possible de faire une classe de template:

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

mais est-il possible de créer une classe en dehors d'un modèle, puis de transformer une fonction de cette classe en modèle? C'est à 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(){}
};

ou quelque chose dans la mesure où la classe ne fait pas partie d'un modèle, mais la fonction est?

127
user98188

Votre proposition est la bonne. La seule chose que vous devez vous rappeler est que le modèle de fonction membre definition (en plus de la déclaration) devrait être dans le fichier d’en-tête, pas le cpp, bien qu’il soit pas doit être dans le corps de la déclaration de classe elle-même.

101
Not Sure

Voir ici: Modèles , méthodes de modèle , Modèles de membre, Modèles de fonction de membre

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

Oui, les fonctions de membre de modèle sont parfaitement légales et utiles à de nombreuses occasions.

Le seul inconvénient est que les fonctions de membre de modèle ne peuvent pas être virtuelles.

19
Tobias

Le moyen le plus simple est de placer la déclaration et la définition dans le même fichier, mais cela peut entraîner un fichier excutable surdimensionné. Par exemple.

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

Il est également possible de placer la définition du modèle dans des fichiers séparés, c’est-à-dire de les placer dans des fichiers .cpp et .h. Tout ce que vous avez à faire est d'inclure explicitement l'instanciation de modèle dans les fichiers .cpp. Par exemple.

// .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
hey