Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3211 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Contourner le Koenig lookup

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Contourner le Koenig lookup

n°896044
Joel F
Real men use unique_ptr
Posté le 11-11-2004 à 15:18:22  profilanswer
 

Voici un extrait de mon code :
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. namespace fml
  4. {
  5.   struct Matrix
  6.   {
  7.     size_t v;
  8.     Matrix(size_t v_) : v(v_) {}
  9.     Matrix& operator=( const Matrix& m )
  10.     {
  11.       v = m.v;
  12.       return *this;
  13.     }
  14.   };
  15. }
  16. namespace ppc
  17. {
  18.   fml::Matrix operator+( const fml::Matrix& m, const fml::Matrix& p )
  19.   {
  20.      // operateur "simd" (resultat different pr meilleur visu)
  21.     return fml::Matrix(m.v*p.v);
  22.   }
  23. }
  24. fml::Matrix operator+( const fml::Matrix& m, const fml::Matrix& p )
  25. {
  26.   // operatuer classique
  27.   return fml::Matrix(m.v+p.v);
  28. }
  29. using namespace fml;
  30. #define ENABLE_SIMD(ARCH) { using namespace ARCH
  31. #define DISABLE_SIMD(ARCH) }
  32. int main( int, const char** )
  33. {
  34.   Matrix a(5),b(7),d(0);
  35.   d = a+b;
  36.   cout << "fml : " << d.v << endl;
  37.  
  38.   ENABLE_SIMD(ppc);
  39.   d = a+b;
  40.   cout << "fml::ppc : " << d.v << endl;
  41.   DISABLE_SIMD(ppc);
  42.   d = a+b;
  43.   cout << "fml : " << d.v << endl;
  44. }


 
Ne faites pas attention au struct ultra imple et au macro moche.
Ce code ne compile pas :
 


g++ test.cc -o main.exe
test.cc: In function `int main(int, const char**)':
test.cc:48: error: ambiguous overload for 'operator+' in 'a + b'
test.cc:31: error: candidates are: fml::Matrix operator+(const fml::Matrix&, const fml::Matrix& )
test.cc:25: error: fml::Matrix ppc::operator+(const fml::Matrix&, const fml::Matrix& )
 
Compilation exited abnormally with code 1 at Thu Nov 11 15:08:07


 
Ce qui est completement logique lorsque l'on suit le Koenig Lookup.
 
Ma question est de savoir COMMENT effectuer le calcul avec le bon operator+ et non pas celui correspodnant au KL.
 
 
 
 

mood
Publicité
Posté le 11-11-2004 à 15:18:22  profilanswer
 

n°896087
Panini
Posté le 11-11-2004 à 16:05:39  profilanswer
 

Code :
  1. namespace ppc
  2. {
  3.     fml::Matrix operator+( const fml::Matrix& m, const fml::Matrix& p )
  4.     {
  5.         // operateur "simd" (resultat different pr meilleur visu)
  6.         fml::Matrix(m.v*p.v);
  7.     }
  8. }
  9. fml::Matrix operator+( const fml::Matrix& m, const fml::Matrix& p )
  10. {
  11.     // operatuer classique
  12.     return ARCH::operator +(m, p);
  13. }
  14. using namespace fml;
  15. int main(int argc, const char *argv)
  16. {
  17.     matrix a(5), b(7), d(0);
  18.     #define ARCH ppc   
  19.     d = a + b;
  20.     #undef ARCH
  21.    
  22.     cout << "fml : " << d.v << endl;
  23.    
  24.     return 0;
  25. }


 
 
Ca doit marcher mais c'est moins beau et pratique :/.

n°896090
Taz
bisounours-codeur
Posté le 11-11-2004 à 16:13:03  profilanswer
 

bah plutôt que de dire 'hey, faut regarder la dedans', dis 'hey utilise ça'
 
#define ENABLE_SIMD(ARCH) { using namespace ARCH
 
->
 
#define ENABLE_SIMD(ARCH) { using namespace ARCH::operator+
 
 
bon évidemment, vu le bordel que tu as, ça va faire beaucoup.
 

n°896091
Taz
bisounours-codeur
Posté le 11-11-2004 à 16:14:12  profilanswer
 

et ouais JoelF, c'est là qu'on voit qui comprend

n°896095
Joel F
Real men use unique_ptr
Posté le 11-11-2004 à 16:29:27  profilanswer
 

Taz a écrit :

et ouais JoelF, c'est là qu'on voit qui comprend


o_O ??? hein ?

n°896104
Taz
bisounours-codeur
Posté le 11-11-2004 à 17:07:59  profilanswer
 

t'as pas du bien lire le truc de Panini

n°896106
Joel F
Real men use unique_ptr
Posté le 11-11-2004 à 17:09:49  profilanswer
 

Taz a écrit :

t'as pas du bien lire le truc de Panini


 
hmmm, oui et c'est totalement pas ca et ensuite ?

n°896107
Taz
bisounours-codeur
Posté le 11-11-2004 à 17:11:04  profilanswer
 

laisse tomber, t'es largué ... tu m'appelles quand tu te réveilles

n°896112
Joel F
Real men use unique_ptr
Posté le 11-11-2004 à 17:15:44  profilanswer
 

Taz a écrit :

laisse tomber, t'es largué ... tu m'appelles quand tu te réveilles


 
C'est juste que j'ai perdu l'habitude de ta réparti légendaire :o
 
bon sinon :
 

Code :
  1. {
  2.     using ppc::operator+;
  3.     d = a+b;
  4.     cout << "fml::ppc : " << d.v << endl;
  5.   }


 
me dit :
 


test.cc: In function `int main(int, const char**)':
test.cc:48: error: syntax error before `operator'
test.cc:49: error: `d' undeclared (first use this function)

n°896118
Taz
bisounours-codeur
Posté le 11-11-2004 à 17:31:43  profilanswer
 

gcc-3.3 inside

mood
Publicité
Posté le 11-11-2004 à 17:31:43  profilanswer
 

n°896123
Joel F
Real men use unique_ptr
Posté le 11-11-2004 à 17:34:38  profilanswer
 

et oui :
 
gcc 3.3.1 :-/
bon je suis senser m'assoir sur cette fantaisie et coder ça de maniere plus sioux.

n°896136
Taz
bisounours-codeur
Posté le 11-11-2004 à 17:48:51  profilanswer
 

pourquoi tu veux changer de mode de calcul comme ça, en plein milieu d'un calcul ?

n°896137
Joel F
Real men use unique_ptr
Posté le 11-11-2004 à 17:50:26  profilanswer
 

parce que je dois permettre d'optimiser localement
mes calculs.

n°896139
Taz
bisounours-codeur
Posté le 11-11-2004 à 17:52:20  profilanswer
 

pourquoi pas optimiser en permanence ?
différents .hpp ça suffit pas ?

n°896141
Joel F
Real men use unique_ptr
Posté le 11-11-2004 à 17:54:23  profilanswer
 

non. Y a des phases de certaines applis qui ne peuvent etre "SIMDiser" facilement. Je dois repasser en mode scalaire tout en continuant à travailler sur la même matrice.
 
Mais si tu as des diées ca m'itneresse.

n°896155
Taz
bisounours-codeur
Posté le 11-11-2004 à 18:10:55  profilanswer
 

en fait du supprimes les optimisation localement ?
 
c'est faisable avec des trucs comme ça
 

Code :
  1. template<typename T>
  2. struct Holder
  3. {
  4.   T &value;
  5.   Holder(T &t) : value(t) { }
  6.   operator T() { return value; }
  7. };
  8. template<typename T>
  9. Holder<T> operator+(Holder<T> &l, Holder<T> &r)
  10. { return ppc::operator+(l.value, r.value); }
  11. template<typename T>
  12. Holder<T> hold(T &v)
  13. { return v; }


 
biensur faut que tu fasses des macros par dessus, etc
 
 
 
mais au fait, pourquoi des fois tu veux repasser en scalaire ?

n°896160
Joel F
Real men use unique_ptr
Posté le 11-11-2004 à 18:14:42  profilanswer
 

exemple : sur des tabelau rikiki le SIDM n'apporte rien,
les algos de tri sont merdiques, donc revenir lcoalement en scalaire evite de perdre du temps.
 
typiquement, y a des algos qui pour etre exprimer en SIMD necessite du preprocessing des données PLUS LONG que le traitement lui même en scalaire.

n°896164
Taz
bisounours-codeur
Posté le 11-11-2004 à 18:17:02  profilanswer
 

et alors ? t'es pas foutu de faire des templates qui décide de l'algo en fonction de la taille ? ou d'un paramètre template ?
 
t'as qu'à rajouter un paramètre template à ton type matrice, par défaut à true, si c'est à false, tu change d'algo

n°896168
Joel F
Real men use unique_ptr
Posté le 11-11-2004 à 18:19:30  profilanswer
 

certes certes .... je cherchais une methode plus simple.
bon je repart sur mon idée initiale alors. Merci :)

n°896172
Taz
bisounours-codeur
Posté le 11-11-2004 à 18:21:49  profilanswer
 

bah ouais :/

n°896185
Joel F
Real men use unique_ptr
Posté le 11-11-2004 à 18:32:38  profilanswer
 

spa grave ^^
ca eu été elegant

n°896192
Panini
Posté le 11-11-2004 à 18:35:54  profilanswer
 

La bidouille que j'ai proposé ne fonctionne pas :o.

n°896195
Taz
bisounours-codeur
Posté le 11-11-2004 à 18:36:42  profilanswer
 

ça on avait vu que t'as pas compris la différence entre template et cpp

n°896204
Panini
Posté le 11-11-2004 à 18:43:25  profilanswer
 

o_O
 
Je vois pas le rapport avec les templates. J'ai déjà utilisé une bidouille semblable, mais le contexte "dynamique" de calcul ici ne le permet pas.

n°896205
Taz
bisounours-codeur
Posté le 11-11-2004 à 18:46:23  profilanswer
 

c'est exactement ça, t'as rien compris

n°896214
Panini
Posté le 11-11-2004 à 18:54:44  profilanswer
 

Merci, je vois très bien où est ma connerie.
Mais ne peux tu pas expliquer clairement plutôt que d'envoyer les gens sur les roses ?
Parce que le rapport entre template, cpp et belle bourde d'utilisation du préprocesseur, je le vois pas trop là.

n°896220
Taz
bisounours-codeur
Posté le 11-11-2004 à 19:02:34  profilanswer
 

ben t'as agit comme si les template étaient des macros

n°896228
Panini
Posté le 11-11-2004 à 19:13:24  profilanswer
 

Bon, y a pas de templates dans le truc que j'ai écris mais je vois ce que tu veux dire.

n°896248
oliv5
Pourquoi ? Parce que !
Posté le 11-11-2004 à 19:33:08  profilanswer
 

Panini a écrit :

Bon, y a pas de templates dans le truc que j'ai écris mais je vois ce que tu veux dire.


 
Moi, je vois pas, et je suis intéressé.
 

Citation :


ben t'as agit comme si les template étaient des macros

n°896367
Panini
Posté le 11-11-2004 à 21:26:10  profilanswer
 

L'erreur est que j'ai voulu utiliser des macros comme un paramètre de template. Dans le cas que j'ai écrit, ça n'a aucun sens. Mon operateur + n'est défini qu'une fois pour une valeur de ARCH donnée qui aurait du être définie en amont. L'usage que j'en fais dans le main n'a donc aucun sens.
 
Bref, le code que j'ai écrit est complètement foireux. La solution template proposée par Taz par contre fonctionne.
Le using ppc::operator+ fonctionne également sous vc.net 2003.

n°896391
oliv5
Pourquoi ? Parce que !
Posté le 11-11-2004 à 21:49:51  profilanswer
 

ha ok. Merci

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Contourner le Koenig lookup

 

Sujets relatifs
Appel distant d'un EJB via un lookup JNDI - Besoin de précisionsContourner limitation des taille de textures en OpenGL
Pourriez vous m'aider a contourner ce Bug de Opera ?[CSS] Contourner le problème "fixed" pour le défilement avec IE
[PHP] Contourner un timeout de 10 secondes lors d'un envoi de fichiersContourner le System.exit(0)
[C++Builder] Lookup et BDE 
Plus de sujets relatifs à : Contourner le Koenig lookup


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)