OVH Cloud OVH Cloud

std_foreach et functor template

36 réponses
Avatar
jeremie fouche
Bonsoir

J'ai actuellement :

class C
{
private:
vector<Type*> m_vector;

public:
void clear(void)
{
for ( vector<Type*>::iterator i = m_vector.begin()
; i != m_vector.end()
; ++i
)
{
delete *i;
}
vector.clear();
}
};


je voulais changer le gros for en un std::for_each

1er essai :

void del(Type* ptr)
{
delete ptr;
}

void clear(void)
{
std::for_each(m_vector.begin(), m_vector.end(), del);
vector.clear();
}

Ca fonctionne !

2eme essai (car j'ai plusieurs conteneur de différent type) :

template <class T>
void del(T* ptr)
{
delete ptr;
}

void clear(void)
{
std::for_each(m_vector.begin(), m_vector.end(), del);
vector.clear();
}

Pouf, ca ne compile pas. Pourquoi la fonction template ne peut etre
créée pour la class Type* ?

Merci pour vos réponses
--
Jérémie

10 réponses

1 2 3 4
Avatar
espie
In article ,
James Kanze wrote:

Dans le cas de Java, évidemment : on a un langage qui s'est
basé sur C. Pourquoi, par exemple, sans la contrainte de la
compatilibilité, il n'a pas répensé la syntaxe des
déclarations ?


Pour attirer son public.

Ca marche (malheureusement) tres bien...

Avatar
Gabriel Dos Reis
This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.

--8323584-573008096-1197383986=:12489
Content-Type: TEXT/PLAIN; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT

On Tue, 11 Dec 2007, Michael DOUBEZ wrote:

| > | Une des raisons principales pour sa manque de
| > | simplicité et d'élégance, c'est qu'il se base sur le C. Sans ce
| > | rapport avec le C, je suis sûr qu'il serait beaucoup plus simple
| > | et plus élégant (encore que les problèmes de compatibilité entre
| > | le C++ d'aujourd'hui, et celui du passée, exigeraient aussi des
| > | compromis). Sans ce rapport, il serait aussi beaucoup moins
| > | utilisé, vraiment beaucoup.
| >
| > Note cependant que d'autres langages comme Java on Ada n'ont pas ce
| > poids de compatibilité avec le C, mais sont quand même assez complexes
| > (au moins aussi complexe que C++).
|
| AMA, le langage Java en lui même n'est pas très difficile à apprendre. Ce qui
| prends du temps est la tonne de bibliothèques, frameworks et patterns associés
| sans lesquels Java perd beaucoup de son intérêt.

Oui, mais qu'est-ce qui fait un langage ?

-- Gaby
--8323584-573008096-1197383986=:12489--
Avatar
James Kanze
On Dec 11, 12:14 pm, (Marc Espie) wrote:
In article om>,
James Kanze wrote:
Dans le cas de Java, évidemment : on a un langage qui s'est
basé sur C. Pourquoi, par exemple, sans la contrainte de la
compatilibilité, il n'a pas répensé la syntaxe des
déclarations ?


Pour attirer son public.

Ca marche (malheureusement) tres bien...


Je sais. Je me rappelle parler avec quelqu'un chez Alcatel, peu
après son apparition. (Quelqu'un qui aimait bien l'Ada, en
fait.) J'ai posé cette question, et il m'a répondu : la
compatibilité psychologique. Ce qui est un très bonne réponse, à
mon avis.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
James Kanze
On Dec 11, 10:44 am, Fabien LE LEZ wrote:
On Tue, 11 Dec 2007 00:47:57 -0800 (PST), James Kanze
:

Well, il y a Perl :-/


C'est vrai. Comme quoi, avec un peu d'effort, on peut donner
même à C++ l'air d'être simple et élégant en comparaison.


J'ai essayé d'utiliser, dans bash, des fonctions capables de
renvoyer une valeur. C'est mignon aussi.


Bash souffre, au moins en partie, du même problème que C++ :
les contraintes de compatabilité avec ces prédécesseurs. Mais
l'histoire de la fonction qui renvoie une valeur, c'est due à
une autre cause : une fonction s'appelle exactement comme si
elle était une commande système. (Et en passant, qu'est-ce que
tu entends par << renvoyer une valeur >> ? Le code de retour,
ou les sorties standard ? Capter ces dernières exige une
syntaxe un peu bizarre, on peut le dire.)

Ce qui est beau avec bash, et les autres shells, évidemment,
c'est qu'une bonne partie du programme s'exécute dans les
commandes qu'il invoque. Chacune avec sa propre syntaxe. Ce qui
fait qu'il y a des syntaxes dans la syntaxe, et qu'il faut
savoir à chaque instant qui va interpréter quoi.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



Avatar
Jean-Marc Bourguet
James Kanze writes:

Ce qui est beau avec bash, et les autres shells, évidemment,
c'est qu'une bonne partie du programme s'exécute dans les
commandes qu'il invoque. Chacune avec sa propre syntaxe. Ce qui
fait qu'il y a des syntaxes dans la syntaxe, et qu'il faut
savoir à chaque instant qui va interpréter quoi.


Et apres, tu mets ca dans un makefile... :-)

--
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
Michael DOUBEZ
On Tue, 11 Dec 2007, Michael DOUBEZ wrote:

| > | Une des raisons principales pour sa manque de
| > | simplicité et d'élégance, c'est qu'il se base sur le C. Sans ce
| > | rapport avec le C, je suis sûr qu'il serait beaucoup plus simple
| > | et plus élégant (encore que les problèmes de compatibilité entre
| > | le C++ d'aujourd'hui, et celui du passée, exigeraient aussi des
| > | compromis). Sans ce rapport, il serait aussi beaucoup moins
| > | utilisé, vraiment beaucoup.
| >
| > Note cependant que d'autres langages comme Java on Ada n'ont pas ce
| > poids de compatibilité avec le C, mais sont quand même assez complexes
| > (au moins aussi complexe que C++).
|
| AMA, le langage Java en lui même n'est pas très difficile à apprendre. Ce qui
| prends du temps est la tonne de bibliothèques, frameworks et patterns associés
| sans lesquels Java perd beaucoup de son intérêt.

Oui, mais qu'est-ce qui fait un langage ?


Si on se limite à la définition restrictive de "langage de
programmation" comme l'ensemble des éléments syntaxiques permettant de
communiquer avec une machine alors la question peut se poser de savoir
si les bibliothèques font partie du langage ou non.

Dans le cas particulier d'un langage standardisé avec une librairie
standard, AMA elles en font parties car elles sont spécifiées dans le
standard, donc le compilateur pourrait les intégrer directement (comme
la vérification de format en C pour les fonction de style printf).

Maintenant en Java, il y a un standard defacto (encore géré par Sun je
crois) où le programmeur discute avec la machine virtuelle qui discute
avec la machine réelle. Cet ensemble de base pour discuter avec la JVM
est AMA assez simple à maitriser; la difficulté arrive quand on passe
aux frameworks: J2EE, J2ME, J2BingWizzBang ...

Ici, je pense qu'on franchit la ligne de séparation langage/bibliothèque
car ces modifications/spécialisations de la bibliothèque standard de la
JVM répondent à une limitation du modèle Java: celui-ci ne permet pas
l'accès à la machine. Donc, pour assurer le paradigme "Compile Once, run
everywhere" qui a fait leur succès, ils sont obligés de fournir, une
distribution standard qui garanti un certain nombre de fonctionnalités.
Nous sommes ici dans une famille de produits en non plus dans le domaine
du langage même si quelque part, avec Java, c'est le distributeur du
produit qui definit le langage.


Michael

Avatar
James Kanze
On Dec 12, 9:32 am, Jean-Marc Bourguet wrote:
James Kanze writes:
Ce qui est beau avec bash, et les autres shells, évidemment,
c'est qu'une bonne partie du programme s'exécute dans les
commandes qu'il invoque. Chacune avec sa propre syntaxe. Ce qui
fait qu'il y a des syntaxes dans la syntaxe, et qu'il faut
savoir à chaque instant qui va interpréter quoi.


Et apres, tu mets ca dans un makefile... :-)


Il faut bien quelque chose pour rendre les choses
intéressantes:-). GNU make est un langage Turing complet en
lui-même. Plutôt fonctionnel d'orientation, et dynamique -- un
peu comme si on avait des templates qui se résolvait lors de
l'exécution. Ajoute à ça qu'il y a une bonne partie qui est
déclarative, ce qui fait qu'il n'y a nulle part pour mettre des
log ou des traces, et qu'il n'y a pas d'outils de deboggage, et
on a du quoi s'occuper pour un moment.

En revanche, à l'encontre du shell, les fichiers source du make
ne contient en général que du make. L'utilisation d'autres
syntaxes se cantonne en général dans les règles de production,
bien séparées dans le fichier.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Gabriel Dos Reis
This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.

--8323584-1198403625-1197553713=:12284
Content-Type: TEXT/PLAIN; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT

On Wed, 12 Dec 2007, Michael DOUBEZ wrote:

| Maintenant en Java, il y a un standard defacto (encore géré par Sun je crois)
| où le programmeur discute avec la machine virtuelle qui discute avec la
| machine réelle. Cet ensemble de base pour discuter avec la JVM est AMA assez
| simple à maitriser; la difficulté arrive quand on passe aux frameworks: J2EE,
| J2ME, J2BingWizzBang ...

Il n'est pas clair que la bibliothèque ne fait pas partie du language.
Considère les classes comme String avec ses operateurs surchargés
qu'on ne peut pas écrire dans le langage lui même.

-- Gaby
--8323584-1198403625-1197553713=:12284--
Avatar
Michael DOUBEZ
On Wed, 12 Dec 2007, Michael DOUBEZ wrote:

| Maintenant en Java, il y a un standard defacto (encore géré par Sun je crois)
| où le programmeur discute avec la machine virtuelle qui discute avec la
| machine réelle. Cet ensemble de base pour discuter avec la JVM est AMA assez
| simple à maitriser; la difficulté arrive quand on passe aux frameworks: J2EE,
| J2ME, J2BingWizzBang ...

Il n'est pas clair que la bibliothèque ne fait pas partie du language.
Considère les classes comme String avec ses operateurs surchargés
qu'on ne peut pas écrire dans le langage lui même.


Je suis d'accord mais AMA il y a des choses intégrés à la VM qui
relèvent du cas d'utilisation.

Avec Java, on pourrait dire que tout fait parti du langage puisque tout
est livré par ligne de produit et qui plus est intégré à la VM (tout
ou presque, je ne sait pas).
Donc, soit on dit qu'il y a plusieurs langages Java: le java J2SE, le
java J2EE ... qui dependent de la VM sur laquelle ils tournent. Ou alors
dresser une ligne en disant que J2SE (la VM de base) définit le langage
(le coeur du langage) et que les autres produits sont des déclinaisons.

Je pourrait aussi wrapper du code C++ en Java et le distribuer pour les
diférentes plateformes supportées par la VM et le livrer avec les
distributions de Sun. Pour moi, ça reste une bibliothèque et c'est ainsi
que je considère les différentes sortes de J2Machin.

L'argument est faible, je le voit: tant qu'il n'y aura qu'un seul
décideur de ce qu'est Java, tous ce qu'il intègre dans le produit
pourrait être considéré comme faisant parti du langage.

Michael

Avatar
Sylvain
Michael DOUBEZ wrote on 13/12/2007 22:04:

L'argument est faible, je le voi[s]: tant qu'il n'y aura qu'un seul
décideur de ce qu'est Java, tou[t] ce qu'il intègre dans le produit
pourrait être considéré comme faisant parti du langage.


les lieux de définition de Java (au sens le + large) ne sont peut être
pas l'image parfaite d'un comité de proposition pour le C ou C++, soit.
penser pour autant qu'il n'existerait qu'un seul décideur (moral, je ne
saurais lire physique) est une erreur.

les "APIs standards et obligeatoires" (dont l'ensemble définit un subset
du langage: ME, SE ou EE) sont normalisées par Sun mais leurs origines
sont multiples.

le fait qu'une classe propose des opérateurs - impossibles à définir
soi-même - ou non, n'est pas imho un fait d'appartenance au langage.
"langage Java", pas plus que "langage C++" ne se réduit à sa seule
syntaxe, un environnement Java (ME, SE ou EE) est donc nécessairement
constitué de tous les packages (toutes les librairies) obligeatoires
pour cet environnement - comme un environnement C++ 'conforme' sera
constitué de l'ensemble de sa librairie standard.

Sylvain.

1 2 3 4