OVH Cloud OVH Cloud

template et type pointeur

4 réponses
Avatar
Philippe Mesmeur
J'ai une classe template du style:


template <class Type>
class myTemplateClass
{

...

private:
void deleteAttr();

private:
Type myAttr;

};


Je voudrais savoir si il y a moyen par une bidouille ou une autre ;-) de
definir ma fonction deleteAttr() de sorte que:
- si "Type" est un pointeur sur je ne sais quoi, que deleteAttr()
fasse un delete myAttr;
- sinon, qu'il fasse un memset(&myAttr, 0, sizeof(myAttr));

Merci d'avance

4 réponses

Avatar
Jean-Marc Bourguet
Philippe Mesmeur writes:

J'ai une classe template du style:


template <class Type>
class myTemplateClass
{

...

private:
void deleteAttr();

private:
Type myAttr;

};


Je voudrais savoir si il y a moyen par une bidouille ou une autre ;-) de
definir ma fonction deleteAttr() de sorte que:
- si "Type" est un pointeur sur je ne sais quoi, que deleteAttr() fasse
un delete myAttr;
- sinon, qu'il fasse un memset(&myAttr, 0, sizeof(myAttr));


Specialisation partielle de la classe ou d'une classe annexe.
Vraissemblablement d'une classe annexe, pas d'une fonction car ce
n'est pas possible.

template <typename T>
struct Helper
{
static void doDelete(T& t);
};

template <typename T>
void Helper<T>::doDelete(T& t)
{
memset(&t, 0, sizeof(t));
}

template <typename T>
struct Helper<T*>
{
static void doDelete(T*& t);
};

template <typename T>
void Helper<T*>::doDelete(T*& t)
{
delete t;
}

template <typename Type>
void myTemplateClass<Type>::deleteAttr()
{
Helper<Type>::doDelete(myAttr);
}

Pour etre un peu plus generique, passer Helper en argument template

template <typename Type, typename Helper = Helper<Type> >
class myTemplateClass...

Le memset ne m'attire pas tellement (on peut toujours fournir une
specialisation explicite si ca n'est pas adequat mais bon...) Pour
etre g

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Michel Michaud
Dans news:, Philippe Mesmeur
J'ai une classe template du style:


template <class Type>
class myTemplateClass
{

...

private:
void deleteAttr();

private:
Type myAttr;

};


Je voudrais savoir si il y a moyen par une bidouille ou une autre
;-) de definir ma fonction deleteAttr() de sorte que:
- si "Type" est un pointeur sur je ne sais quoi, que
deleteAttr() fasse un delete myAttr;
- sinon, qu'il fasse un memset(&myAttr, 0, sizeof(myAttr));


Oui (voir la réponse de Jean-Marc, mais il y a aussi des outils
plus généraux chez Boost), mais je reste perplexe devant un
programme qui utilisera la méta-programmation C++ et un memset !
Je crois qu'il faut que tu fournisses une meilleure méthode
pour la réinitialisation et là, le cas du pointeur ne sera qu'un
parmi d'autres.

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
Philippe Mesmeur
Une fois de plus, merci beaucoup pour la reponse. Cependant, pour ma
"culture personnelle" ;-) je voudrais savoir ....

Jean-Marc Bourguet wrote:
Specialisation partielle de la classe ou d'une classe annexe.
Vraissemblablement d'une classe annexe, pas d'une fonction car ce
n'est pas possible.



ce qui fait qu'une fonction/method template n'est pas possible?

Merci d'avance


Philippe

Avatar
Jean-Marc Bourguet
Philippe Mesmeur writes:

Une fois de plus, merci beaucoup pour la reponse. Cependant, pour ma
"culture personnelle" ;-) je voudrais savoir ....

Jean-Marc Bourguet wrote:
Specialisation partielle de la classe ou d'une classe annexe.
Vraissemblablement d'une classe annexe, pas d'une fonction car ce
n'est pas possible.



ce qui fait qu'une fonction/method template n'est pas possible?


On ne peut pas specialiser partiellement une fonction template.

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org