Bonjour j'aimeais juste savoir quel est le type qui peut se transformer en n'importe quel autre type..j'Ai essayer variant mais çca ne marche pas est ce que c bien COBject?
Bonjour j'aimeais juste savoir quel est le type qui peut se transformer en n'importe quel autre type..j'Ai essayer variant mais çca ne marche pas est ce que c bien COBject?
Il n'y a pas ce genre de type en C++ de base. Il peut être simulé mais ce n'est pas dans l'esprit C++. Pourquoi as-tu besoin d'un tel type ?
un tres grand nombre de classe MFC (toutes?) sont dérivés de CObject comme les class java sont dérivées de TObjet.
comme dit ci dessus : tu veux faire quoi ?
La classe Object est utilisée comme type universel sous C++ CLI (et donc .NET)
Il peut être intéressant d'avoir une class Objet dans un langage comme Java, ou C# (et donc forcément C++/CLI), qui ne connaissent pas vraiment les templates de C++. Dans le cas du C++, l'intérêt reste à prouver (et il a plutôt été prouvé négativement).
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.
Encore que, j'ai un prof qui trouve que les templates sont une aberration car ça donne une taille de code monstrueuse (Lui, il préfère des collections de void *, quan don les gère adroitement ça marche très bien).
Mais j'admets que sur un PC, on ne compile plus en -Os depuis un fameux moment... Ce n'est plus le code qui prend le plus de place dans un programme.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Il faudrait peut-être lui signaler d'une part qu'il n'est pas très compliqué de partager le code partageable quand c'est nécessaire, d'autre part que les templates sont utilisés pour bien d'autres choses que les collections.Envoyé par Médinoc
Tout dépend des programmes. Il y a toujours eu des programmes pour lesquels on aurait bien aimé garder toutes les données en mémoire si ç'aurait été possible; ne l'étant pas, on continue à s'arranger autrement. Chose qu'on ne doit plus faire pour le code (mais qu'on a fait).Mais j'admets que sur un PC, on ne compile plus en -Os depuis un fameux moment... Ce n'est plus le code qui prend le plus de place dans un programme.
Dans l'autre sens, je me demande si tu as déjà regardé la taille des bibliothèques partagées utilisées par quasiment n'importe quel programme...
boost::any :-)Envoyé par JolyLoic
Le problème principal est que si le langage ne la fournit pas, c'est impossible à ajouter par après de manière raisonnable. On ne peut même pas en faire une convention dans un projet important car cette convention ne sera pas suivie par le code étranger que tôt ou tard on sera amené à réutiliser.
Tout le code d'une classe template qui ne dépend pas du type d'instanciation est (si c'est correctement programmé) regroupé au sein d'une classe non générique dont la classe template hérite.Envoyé par Médinoc
La plupart des implémentations des conteneurs de la STL marchent comme ça, ce qui implique qu'en interne, elles manipules des collections de void *, mais assurent à l'utilisateur un typage correct.
Quant à la taille du code généré, si dans certain cas, cela peut-être un problème, je pense qu'aujourd'hui la majeure partie des applications préfères un code plus flexible et plu sûr, quitte à ce qu'il prenne plus de place.
Et puis quand tu manipules un tableau, tu as forcément derrière un code assembleur spécifique au type des données du tableau. Si c'est un tableau d'octets, ce code parcourera la mémoire octet par octet, si c'est des int, probablement à coup de 4 octets. C'est obligatoire.
Avec les templates, ce code est généré au sein des opérateur spécialisés [] et at(). Si c'est des void*, c'est dans ton code d'accès peu après le cast en char * ou int *. Donc ça revient au même, strictement.
désolée pour ler etard dans mes érponses mais j'étais sur un autre problèmes et j'ai oubliéé![]()
en fait ce que j'aimerais faire, c'Est certaines opérations sur un objet, seulement je ne sais pas d'Avance si c'Est un int une string, long....
donc quand je le passe en paramèetre, j'aimerais simplement le déclarer comme objet et ensuite en faire ce que je veux
en gros, lorsque j'appelle ma fonction:
et dans ma déclaration ma fonction aurait:
Code : Sélectionner tout - Visualiser dans une fenêtre à part faireOprration(monObjet)
comment je pourrais alors désigné que c'Est un objet???
Code : Sélectionner tout - Visualiser dans une fenêtre à part void faireOperation(type monObjet)
Si tu veux simplement faire des opérations différentes par type, tu n'as qu'à surcharger ta fonction pour chaque type donc tu as besoin:
Ou si tu veux être plus général, utiliser les templates (voir FAQ)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 void faireOperation(int x); void faireOperation(float x); void faireOperation(maClasse x); ...![]()
Partager