Newsgroup: it.comp.lang.c++
Titolo: Tipo membro

Salve,
vorrei dichiarare una variabile dello stesso tipo di un membro dati di
una classe, conoscendo solo il nome di questo membro.
E` possibile?
Un esempio:
class A {
  int i; float f;
};
int main() {
  ?? A::i ?? ii;
}
dove ii deve avere lo stessi tipo di A::i (int).
Per il momento ho fatto typedef per ogni membro, ma gradirei una
soluzione più "elegante".
Saluti,
alef

 soluzione più "elegante".
Servirebbe typeof (non ancora disponibile).
Kiuhnm

Kiuhnm ha scritto:

Qualche compilatore lo implementa come estensione non(ancora)standard.
Nella libreria Boost c'e' un BOOST_TYPEOF(x) (anzi, piu' di una 
variante), mai usate personalmente.
All'OP: se possibile, mi interesserebbe sapere perche' hai bisogno di 
sapere il tipo di ogni variabile membro di una tua classe?
-- 
Roal Zanazzi

 variante), mai usate personalmente.
...che è o incompleto oppure utilizza qualche altra funzionalità non 
standard...
Kiuhnm

 sapere il tipo di ogni variabile membro di una tua classe?
Le classi sono generate da un parser. Il tipo cambia in base ad una
statistica sui dati e se i dati cambiassero in futuro, potrebbe
cambiare il tipo. Usando un typedef per membro, riduco la quantità di
codice da modificare all'utente, ed inoltre l'utente non deve ogni
volta aprire il relativo .hpp per sapere di che tipo è il membro ma sa
che si chiama membro_t.
Saluti,
Alessandro

 
Abbastanza chiaro, piu' o meno.
Quello che non mi e' chiaro e', dato il tuo esempio:
class A {
     int i;
     float f;
};
che necessita' c'e' di far sapere all'utilizzatore della classe i tipi 
dei suoi membri, dato che sono privati.
A meno che le suddette classi non siano in realta' delle "strutturone"...
Magari sono delle classi che mappano delle tabelle di database?
 > ed inoltre l'utente non deve ogni
 > volta aprire il relativo .hpp per sapere di che tipo è il membro ma sa
 > che si chiama membro_t.
 >
Doxygen potrebbe generare una documentazione decente delle interfacce 
delle tue classi.
E un buon ambiente di sviluppo con qualcosa di simile all'"intellisense" 
(a-la Visual Studio o Borland) e' un valido aiuto ;-)
Personalmente, nei panni di un ipotetico utilizzatore di tali classi, 
preferirei dover sapere il meno possibile sul tipo delle sue variabili 
membro. Ma se proprio fossi costretto preferirei avere un generico 
TYPEOF, piuttosto che un typedef per ogni membro.
-- 
Roal Zanazzi

 TYPEOF, piuttosto che un typedef per ogni membro.
Queste classi non sono altro che insiemi di dati. Se l'utente volesse
trattenere uno di questi singoli dati, dovrebbe conoscerne il tipo. Con
i typedef non ha bisogno di saperlo. L'unico inconveniente è con i
null perchè invece di essere semplici dati membro sono getter che
tornano optional<tipo> e quindi deve scrivere () e deferenziare quando
necessario.
Sperando di non dilungarmi troppo, ecco un breve esempio ridotto
(senza constness, #include, using, ::begin/end, size, ecc.)
struct dbo_test_t {
 bool value_n: 1; // per i null della colonna value (true = è null)
 typedef unsigned short ID_t;
 ID_t ID; // il dato membro accessibile
 typedef const char* description_t;
 description_t description; // il null viene già gestito dal puntatore
 typedef optional<int> value_t; // qui il tipo per value
 int _value; // "_nascosto" perchè il nome lo diamo ...
 // ... al getter
 value_t value() { return value_n ? value_t() : value_t(_value); }
};
dbo_test_t dbo_test[] = {
 { false, 1, "prova", 10 },
 { false, 2, "prova2", 20 },
 { true, 3, "prova_null", 0},
 ....
};
Saluti,
alef