PDA

Visualizza la versione completa : [C++] Contenuti di variabili come linguaggio


Slamdunk
12-09-2008, 20:38
Salve, sto facendo un progetto in cui ho bisogno di fare l'analogo di php:

$nome = "variabile";
$$nome_1 = true;

Ora mi spiego meglio.

Ho una classe templata, che può usare tanti tipi come templatura.
I tipi che questa può usare vengono forniti in input dalla persona che usa il programma.
Necessariamente, in input la stringa che contiene il tipo sarà un char[].

Ho bisogno di usare il contenuto dei char in ingresso proprio come testo di linguaggio, perché altrimenti la soluzione è quella di fare degli switch (o if-else) i cui contenuti siano tutti uguali con solo la chiamata al template diversa.

Cioè, io vorrei cambiare il programma da così:


#include <iostream>
using namespace std;

int main()
{
char g[10];
cin >> g;

switch (g) {
case 'int':
Classe<int> c;
break;
case 'float':
Classe<float> c;
break;
case 'double':
Classe<double> c;
break;
}

return 0;
}

A così:


#include <iostream>
using namespace std;

int main()
{
char g[10];
cin >> g;

Classe<g> c;

return 0;
}
È possibile farlo in qualche modo?

shodan
12-09-2008, 20:48
Non con i template. I tipi con cui istanziare i template devono essere noti in fase di compilazione.

edit:

forse puoi trovare qualche spunto qui:
http://www.eptacom.net/pubblicazioni/pub_it/nl_2.html

Slamdunk
12-09-2008, 21:04
Il fatto è che al momento dell'input, l'utente può scegliere quale tra le 10 Classi disponibili usare, e per quella scelta quale tra i 4 Tipi disponibili usare, quindi il modo che viene naturale pensare per primo è un doppio switch, solo che vengono fuori decine e decine di righe uguali, cambiate solo per il nome della classe e il tipo dato al template.

Usando due switch che usino typedef si può risparmiare e tempo, ma cmq speravo ci fosse un modo dinamico per scrivere il linguaggio :master:

shodan
12-09-2008, 21:54
Se riesci a raggruppare le operazioni comuni da fare in una classe base, puoi usare il polimorfismo e il Factory pattern (http://en.wikipedia.org/wiki/Factory_method_pattern) e selezionare la classe desiderata tramite una string. Ovviamente dovrai prevedere a priori quante classi sono necessarie.

Slamdunk
13-09-2008, 07:38
Anche se vedo che comunque uno switch ci dovrà essere, certo così il codice può essere meglio organizzato e scritto.

Grazie :)

XWolverineX
13-09-2008, 08:20
Che bella feature, veramente.
Non avrei mai pensato che apotesse essere fatto anche con il C++

MItaly
13-09-2008, 18:02
Stai dimenticando la prima regola del C++: in C++ tutto è possibile :fighet: (magari con dei super-template astratti pseudo-virtuali e delle triple-macro all'amaretto con doppia piroetta carpiata, ma comunque è possibile).

menphisx
14-09-2008, 09:27
Originariamente inviato da MItaly
Stai dimenticando la prima regola del C++: in C++ tutto è possibile :fighet: (magari con dei super-template astratti pseudo-virtuali e delle triple-macro all'amaretto con doppia piroetta carpiata, ma comunque è possibile).

:unz:

Loading