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?
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.
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];
}
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.
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);