Newsgroup: it.comp.lang.c++
Titolo: ritornare tipi diversi

ho un problema e volevo sapere se è possibile risolverlo come segue:
nel pacchetto del software GIS che utilizzo è presente una dll di funzioni
C++ che permettono di gestire il formato nativo matriciale utilizzato
dall'applicazione (creazione, cancellazione, modifica, ecc.). questo formato
matriciale differenzia matrici che contengono int e matrici che contengonio
float, in pratica tutte le funzioni esportate sono doppie: versione per int
e versione pe float. siccome è scomdo utilizzare tutte queste funzioni ho
pensato di crearmi una classe grid che incorpori queste funzioni e che
all'esterno proponga funzioni membro più facili da usare in un codice user.
vorrei però che la classe grid fosse unica, senza distinzioni fra int e
float. il problema che ho è che una ipotetica funzione Get(i,j) che ritorna
l'elemento i,j dovrebbe fare differenza fra int e float.
mi spiego meglio, il controllo sul tipo della grid lo faccio in modo
invisibile nelle funzioni membro della classe, ma la Get dovrebbe ritornare
un int se la grid è int o un float se la grid è float. ovviamente non esiste
overload solo per il tipo ritornato, quindi avevo pensato ad un tipo di
ritorno generico e poi con un cast convertivo, ma non funziona.
c'è un modo o devo arrendermi a fare una classe gridint e una classe
gridfloat?
grazie e ciao
--
Roberto
FV
----------
robymes#
hotmail.com
ICQ# 37732681
----------
Tessera #90 Fan Club Jolene Blalock
----------
Resistance is futile

gridfloat?
Praticamente hai due tipi di grid che contewngono dati diversi?
Se è così perché non usi i template avrai grid<int> e grid<float> o se
vuoi che la classe sia sempre la stessae se non ti crea problemi
potresti ritornare sempre un float.
-- 
Marco Barisione (ICQ 84277092)

 potresti ritornare sempre un float.
hai presente quando lavori e lavori e alla fine non ci capisci piů nulla?
ebbene, appena ho letto la tua risposta mi sono detto "cazzo č vero.... i
template!". alle volte le cose piů immediate ti passano di mente e vai a
cercare cose assurde.
grazie


 ha scritto nel messaggio
news:9ofibq$csqtq$1...@ID-85026.news.dfncis.de...

Immaginando che il lavoro oneroso sia l'implementazione della classe
user friendly, io incapsulerei le f() della dll in funzioni inline
generiche, magari in un namespace proprio e quindi le userei per creare
una classe generica, qualcosa tipo:
#include <iostream>
using namespace std;
// supponendo che queste siano le funzioni nella dll
// che io ho abbozzato solo per testare lo schema.
float funzione_dll_float(int i,int j){ return 1.55; }
int funzione_dll_int(int i,int j){ return 2; }
namespace dll {
  template <typename T>
  T funzione(int i, int j);
  template <>
  inline float funzione<float>(int i, int j )
  {
      return funzione_dll_float(i,j);
  }
  template <>
  inline int funzione<int>( int i, int j )
  {
      return funzione_dll_int(i,j);
  }
}
template <typename T = float>
struct grid
{
    // qui immagino che ci siano da fare un po' di operazioni
    // ma siano le stesse tanto per gli int che per i float
    T Get(int i, int j )
    {
        return dll::funzione<T>( i, j);
    }
};
int main()
{
    grid<>      gFloat; // e' come averne implementate due
    grid<int>   gInt;   // al costo di una
    cout << gFloat.Get(1,0) << '\n';
    cout << gInt.Get(2,1) << '\n';
}
ciao
Massimo

 una classe generica, qualcosa tipo:
studierò bene la tua soluzione perchè ha una struttura di implementazione
che non ho mai incontrato, ad una prima lettura risolverebbe anche un altro
problema che mi è venuto in mente (con una semplice class template nella
ipotetica Get(i,j) avrei bisogno di sapere se sto utilizzando una int o una
float in quanto le funzioni native utilizzano una GetFloat e una GetInt e
quindi nella mia Get dovrei fare un if del tipo: se è una grid float esegui
la funzione nativa GetInt, altrimenti la funzione nativa GetFloat,
altrimenti ancora segnala l'errore. Con la tua soluzione mi sembra di non
aver bisogno di questo.
se non capisco qualcosa magari mi faccio sentire.
ciao e grazie
