PDA

Visualizza la versione completa : [C++] template e binding dati


giuseppe500
19-08-2014, 17:11
ciao .
Sto provando a creare un oggetto trasformator che prende in ingresso due o tre parametri e crea un dato idn ucita, chiamando una funzione statica che ha i parametri come parametro scusate il gioco di parole.
I due o tre parametri sono i dati che passo alla classe host ,il mio problema come gestire l'aggancio tra i dati e l''oggetto transformation per es ho fatto un oggetto data che un vector alla fine che contiene punti.
ci sono 6 di questi oggetti data e vorrei in qualche modo passare un parametro template che mi dice : "quest oggetto trasformator prende in ingresso idati 1, 4,e 6 e ritorna qualcosa risultato della trasformazione"

l'oggetto trasformator qualcosa del genere:


class TransformNormals
{
public static Data doTrasformation(data data1, data data2, data data3){
. . .trasformazione
}
}

e lo vorrei passare cosi alla host class:


template<class Transform<1,4,6>, data1,data2,data3,data4,data5,data6>
class transformhost
{
void initialize(){
Transform::doTransformation(data1,data4,data6);
}
}



esistono casistiche di questo tipo o risolvere con un traits o un convertitore da tipo a numerico ?
o risolvere con un function object.
grazie in anticipo.:ciauz:

giuseppe500
19-08-2014, 17:47
ciao .
Sto provando a creare un oggetto trasformator che prende in ingresso due o tre parametri e crea un dato idn ucita, chiamando una funzione statica che ha i parametri come parametro scusate il gioco di parole.
I due o tre parametri sono i dati che passo alla classe host ,il mio problema come gestire l'aggancio tra i dati e l''oggetto transformation per es ho fatto un oggetto data che un vector alla fine che contiene punti.
ci sono 6 di questi oggetti data e vorrei in qualche modo passare un parametro template che mi dice : "quest oggetto trasformator prende in ingresso idati 1, 4,e 6 e ritorna qualcosa risultato della trasformazione"

l'oggetto trasformator qualcosa del genere:


class TransformNormals
{
public static Data doTrasformation(data data1, data data2, data data3){
. . .trasformazione
}
}

e lo vorrei passare cosi alla host class:


template<class Transform<1,4,6>, data1,data2,data3,data4,data5,data6>
class transformhost
{
void initialize(){
Transform::doTransformation(data1,data4,data6);
}
}



esistono casistiche di questo tipo o risolvere con un traits o un convertitore da tipo a numerico ?
o risolvere con un function object.
grazie in anticipo.:ciauz:

forse ho capito , posso usare una mappa con max 10 chiavi dato che al massimo ne ho 10 che sono le semantiche dell'opengl position,normal(i dati sono quindi inseriti per chiave) ecc....e posso trasformare ogni semantica in un indice che va da 0 a 10 e recuperare o agganciare quelle che corrispondono per chiave, quello che non so come posso recuperare gli indici o la stringa per la mappa passandola da un parametro template ad es:
posibile fare cosi:


Transform<1,4,6>

e recuperare per ogni oggetto l'1 ,4,6 ?relativa pero' a quell oggetto , un template parameter?

quello che voglio fare configurare a design time poi a runtime posso usare la mappa e i transformer.

MItaly
20-08-2014, 00:33
Onestamente non riesco a capire che problema stai cercando di risolvere...

giuseppe500
20-08-2014, 12:52
Onestamente non riesco a capire che problema stai cercando di risolvere...

si scusa MItaly rileggendo l'ho capito anch io , scusate .

io ho una mappa con coppie chiavi valori che contiene tutti i dati che mi servono e vorrei agganciare sapendo le chiavi(e le so) ad un command i parametri che configuro.
Se per es ho una mappa con [0][parametro1] [1][parametro2] [2][parametro3]
vorrei che il mio command si andasse a prendere i parametri da solo per cui configurato e potesse essere eseguito, ho capito adesso che la soluzione migliore passare la mappa e lasciare che il mio oggetto si prenda i parametri che gli servono dato che al suo interno ha gli indici.

Spiego dove lo uso:
Ho creato un oggetto mesh che ha vari gruppi di dati(sono vettori principalmente) : le posizioni, le normali, i colori ecc.. vorrei creare dei "trasformatori" per questi gruppi di dati e ho pensato ad una famiglia di oggetti command che prendono come input dati e li trasformano , ad ogni chiamata o solo all inizio.
ad es ci sara il RicalcolaNormaliCommand o l'EstrudiCommand ecc.... e questi command li passo come parametri template cosi che posso configurare i trasformatori che voglio.
chiaramente il RicalcolaNormaliCommand prendera in input dalla mappa le normali e le posizioni, l'EstrudiCommand prender le posizioni ec....

ecco ho pensavo a qualcosa del genere


template<Class Transformer>
class CMesh
{
map<int,BufferData>* m_pmappacondati = new map<int,BufferData>;
vector<TransformerBase>m_transformer;

void init(){
'creo il trasformer all'inizializzazione
Transformaer trans = new Transformer(m_pmappacondati);
m_transformer.push_back(trans)
}
void transform()
{
eseguo i m_transformer che sono nel vector
}

}

vediamo cosa non riesco a fare :
io vorrei passare i transformer come parametro template istanziarli e e aggiungerli al vector dei trasformatori, questo si puo fare in compile time o in design time?


void init(){
'creo il trasformer all'inizializzazione
Transformaer trans = new Transformer(m_pmappacondati);
m_transformer.push_back(trans)
}


come si fa?

grazie, spero di essermi spiegato meglio.
ciao.

Xaratroom
20-08-2014, 14:36
Mettiamo il caso, ma solo un'ipotesi, che io abbia capito il tuo problema: Vuoi poter applicare una serie di trasformazioni (che vengono generate a run time) ai tuoi elementi grafici; quindi io ti consiglierei di impostare (in linea di massima) la struttura dell'applicazione nel seguente modo:




class CMesh { //Base Class
//Interfaccia pubblica usata dai trasformer, ...
}


class Transformer { //Base Class
public: virtual void doStuff(Mesh mesh) = 0;
}


class FooTransformer : public Transformer {
public: FooTransformer(/*params ... */) { /*...*/ }
public: void doStuff(Mesh mesh) { /* do stuff ...*/}
}



Quindi, una volta istanziato il Transformer che ti serve (se hai una serie di parametri fissi, che determinano il tipo di trasformer, puoi anche optare per i template), nel loop principale potrai applicare i vari effetti ai vari oggetti di tipo CMesh nel seguente modo:




CMesh myMesh(/*...*/);
FooTransformer myTransformer(/*...*/);


//....


myTransformer.doStuff(myMesh);



Quindi non sar l'oggetto CMesh, target della trasformazione, a dover prelevare i parametri necessari alla trasformazione stessa, ma sar la Trasformazione (in fase di istanza oppure nella chiamata) a disporre di tali informazioni.


Ovviamente puoi mettere tutti i trasformer in un array ed eseguirli uno dopo l'altro (in questo caso avrai un array contenente le coppie <Transformer, CMesh>) in base a temporizzazioni o eventi.


Spero di aver colto e di essere stato d'aiuto.

Loading