Newsgroup: it.comp.lang.c++
Titolo: Indicizzare classi

Ciao a tutti.
Mi piacerebbe fare una cosa di questo tipo:
template <int i ,int j>
class Function{
};
class Function<1,1> {
 public:
          double operator()(double x,double y){
              return x*y;
          }
};
class Function<1,2> {
 public:
          double operator()(double x,double y){
              return 5.*x*y;
          }
};
class Pippo {
 public:
   double operator()( int& i, int& j, double x, double y) {
   return (Function<i, j>)(x,y);  // Qui si arrabbia il compilatore.
   }
};
Come posso risolvere la cosa?
Grazie.

 };
spero che questo sia un codice esempio, ci sono metodi molto migliori 
per fare una moltiplicazione ;)
non puoi passare valori non costanti a compile time come parametri ad 
un template. il compilatore (che risolve i template) non sa cosa 
metterci.
PS: mi dici a che servono gli int?

 per fare una moltiplicazione ;)
Sì, qui ho semplificato un poco il problema.Quello che sto facendo veramente
e' cercare di costruire una matrice che ha per elementi delle funzioni.
Nella classe Matrice ho bisogno di un operatore che mi fa la valutazione
della funzione in posizione i, j (ecco gli int ).


Come posso risolvere la cosa?
mi vengono in mente almeno due soluzione: se le funzioni che devi
gestire sono poche usa uno switch o qualche if. Se invece le funzioni
sono molteplici prova ad usare una matrice di puntatori a funzione.
Anto
--
Antonio Cuni, 18 anni, studente
Brainbench Certification: 
Master C++: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
http://www.brainbench.com/transcript.jsp?pid=1301688

 sono molteplici prova ad usare una matrice di puntatori a funzione.
Purtroppo le funzioni sono parecchie e i puntatori a funzione mi hanno detto
che non sono molto efficienti (le mie funzioni devono essere valutate in
migliaia di punti distinti.).

migliaia di punti distinti.).
direi che non hai alternative: o determini a compile time quali
funzioni chiamare (ma mi sembra di avere capito che non puoi) oppure
devi per forza rimandare la scelta a runtime: questo comporta in ogni
caso una perdita di efficienza, e, nel caso le funzioni siano tanto,
la scelta dei puntatori a funzione mi pare la più efficiente ed
elegante. 
Oppure potresti rivedere completamente il design della tua
applicazione: cosa devi fare esattamente?


 wrote in message
news:pPrv6.23461$lT1.3...@news2.tin.it...

Se l'inefficienza di un puntatore a funzione ti spaventa, non usare il C++. Dato
il livello di conoscenza che sembri avere del linguaggio e' molto probabile che
tu stia chiamando delle funzioni tramite puntatore senza neppure accorgertene.
Per esempio: lo sapevi che il 99% delle chiamate a metodi virtuali in codice C++
reale avviene tramite un puntatore a funzione "nascosto"?
In ogni caso non credo che tu abbia alternative: anche in C finiresti con
l'usare dei puntatori a funzione.
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

 ha scritto nel messaggio
news:pPrv6.23461$lT1.3...@news2.tin.it...

Non hai altre alternative.
Solo nel caso in cui le funzioni sono dello stesso tipo si può fare
qualcosa.
Ad esempio:
class Function
{
   private:
      double a, b;
   public:
      Function()
      : a(), b() {  }
      Function(double aa, double bb)
      : a(aa), b(bb) {  }
      double operator()(double x, double y)
      {
        return a * x + b * y;
      }
};
#include <iostream>
int main()
{
  Function m[10][10];
  m[1][1] = Function(3., 7.);
  std::cout << m[1][1](1, 2);
}
Tutte le chiamate a funzione sono espanse in linea.
Saluti  Manlio Perillo