|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Candidat au titre de Membre du Club
![]() Inscription : septembre 2010 Messages : 36 ![]() |
Bonjour,
Mon problème est à priori simple, si tant est qu'il ait une solution. L'exemple qui suit n'est pas mon problème mais c'est le même raisonnement. A partir de ces deux fonctions : Code :
Code :
Il n'y aurait pas une solution simple et propre de clarifier ça pour le compilateur ? Merci. |
||||
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() Junior developer C/C++/Embedded system Inscription : juin 2010 Messages : 656 ![]() |
Bonjour,
essaye une syntaxe comme Code :
edit: voir ci-dessous |
||
|
|
00
|
|
|
#3 | ||||
|
Membre expérimenté
![]() Léo GaspardLycéen Inscription : janvier 2012 Messages : 342 ![]() |
AMHA le problème vient de la définition de Sin.
En effet, la seule différence entre les deux définitions est le type de retour, qui n'entre pas en compte dans le choix d'une fonction. Donc il faudrait remplacer par : Code :
Code :
|
||||
|
|
10
|
|
|
#4 | ||||
|
Candidat au titre de Membre du Club
![]() Inscription : septembre 2010 Messages : 36 ![]() |
D'abord merci à tous les deux.
Ensuite, j'affine mon problème (vous ne pensiez pas vous en sortir si facilement ?!). Je voudrais utiliser ça (à peu près pareil qu'au dessus). Code :
Code :
|
||||
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() Junior developer C/C++/Embedded system Inscription : juin 2010 Messages : 656 ![]() |
Est-ce que ceci compilerait :
Code :
template< typename R, typename P> R Sin(P val) { return sin(val); } Sinon, parce qu'il est pas dit que l'ambiguité ne resurgisse pas ( 2 fonctions ne peuvent pas différer par leur unique type de retour) Code :
template< typename R, typename P> void Sin(P val, R& ret) { ret = sin(val); } |
|
|
00
|
|
|
#6 |
![]() ![]() Florian BlanchetEtudiant en Optique Inscription : août 2004 Messages : 789 ![]() |
Je vois pas la Meta-Prog dans ton code ...
La détermination automatique des paramètres template ne sert pas à grand chose ici. Si ton objectif est de créer des fonctions utilisant des algo plus ou moins performant selon la situation, il faut nécessairement que tu dises explictement quel précision tu veux. Si ce n'est pas pour ca que tu as plusieurs version, quel est la raison ? @Ekleog: Préfères la surcharge à la spécialisation des fonctions templates.
__________________
"We can solve any problem by introducing an extra level of indirection" Butler Lampson "N'importe quel problème peut être résolu en introduisant un niveau d'indirection supplémentaire" Butler Lampson (traduction libre) |
|
|
10
|
|
|
#7 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : septembre 2010 Messages : 36 ![]() |
Merci pour toutes ces réponses.
Citation:
N'étant pas encore à fond dans la meta-programmation je voulais savoir si c'était aussi puissant que ça. Apparemment pas puisque le type de retour ne semble pas être pris en compte dans le cas présent (float et double) où la conversion se fait automatiquement. Citation:
Merci encore pour vos réponses, ça m'a beaucoup aidé. |
||
|
|
00
|
|
|
#8 | ||||
![]() ![]() Florian BlanchetEtudiant en Optique Inscription : août 2004 Messages : 789 ![]() |
Si la méta-prog est très puissante, mais ce n'est en aucun cas ce que tu fais, ni ce que tu as besoin. Des classes de traits (plus proche de la programmation générique que de la méta-prog) devraient te suffir.
Mais comment veux-tu que le compilateur sache avec quel précison calculé si tu ne lui dit pas. Par contre si ta précision dépend de la précision du paramètre tu peux faire quelque chose comme : Code :
Code :
__________________
"We can solve any problem by introducing an extra level of indirection" Butler Lampson "N'importe quel problème peut être résolu en introduisant un niveau d'indirection supplémentaire" Butler Lampson (traduction libre) |
||||
|
|
00
|
|
|
#9 | ||||
|
Membre expérimenté
![]() Léo GaspardLycéen Inscription : janvier 2012 Messages : 342 ![]() |
Citation:
Donc non. Citation:
(D'ailleurs, j'ai fait le même abus de langage que Awakening ...) |
||||
|
|
00
|
|
|
#10 | ||
|
Membre Expert
![]() ![]() |
Au passage,
Code :
|
||
|
|
00
|
|
|
#11 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : septembre 2010 Messages : 36 ![]() |
J'aime ce forum !
On en apprend toujours plus que prévu. Du coup la finalité pourrait se traduire par ça : Code :
|
||
|
|
00
|
|
|
#12 |
|
Membre éprouvé
![]() Eric Inscription : décembre 2010 Messages : 254 ![]() |
C'est pas un peu violent pour ce qu'une simple surcharge ferait?
|
|
|
20
|
|
|
#13 | ||
![]() ![]() Matthieu BrucherDéveloppeur HPC Inscription : juillet 2005 Messages : 9 607 ![]() |
Si, je pense. J'aurais écrit ça :
Code :
|
||
|
|
00
|
|
|
#14 | |||
|
Candidat au titre de Membre du Club
![]() Inscription : septembre 2010 Messages : 36 ![]() |
Citation:
@Matthieu Brucher : c'est ce que j'avais fait la toute première fois, mais le deuxième cas des tests suivant ne me plait pas : Code :
|
|||
|
|
00
|
|
|
#15 |
|
Membre éprouvé
![]() Eric Inscription : décembre 2010 Messages : 254 ![]() |
Pourquoi pas:
template<class T> inline float sin(T a){return fsin(a);} double sin(double a){return sin(a);} ? |
|
|
00
|
|
|
#16 |
![]() ![]() Loïc JolyDéveloppeur informatique Inscription : août 2004 Messages : 4 346 ![]() |
Tu veux faire quoi au juste ? Es-tu certain qu'il n'est pas mieux de faire le calcul en double, tout le temps, puis de convertir en float à la fin dans les cas où l'espace de stockage importe ?
As-tu lu : http://www.cs.berkeley.edu/~wkahan/JAVAhurt.pdf (en particulier la section qui commence page 30) ? |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com