UPDATE: 6 mesi più tardi, e ho appena imbattuto in questa risposta: Is it legal to index into a struct?: Answer by Slava. Penso che questa sia una soluzione MOLTO migliore di quella fornita qui, poiché non c'è assolutamente alcun comportamento indefinito. Spero che questo aiuti la prossima persona, poiché è già troppo tardi per me da implementare.Scorrere struct per nome variabile
Prima di commentare dicendo di utilizzare un array o un vettore, o qualsiasi forma di contenitore, invece, è una verità dura che non posso. Lo so, questo sarebbe risolto con un array, e ogni soluzione altrimenti è piuttosto "hacky". Mi piacerebbe usare un contenitore, ma assolutamente non posso.
Sono uno sviluppatore di medio livello presso una società molto grande e stiamo utilizzando una libreria aziendale per inviare dati su Ethernet. Ci sono vari motivi per cui non può supportare matrici/vettori e, invece, utilizza le strutture di POD (Plain Old Data: char, float, ints, bool). Comincio con una serie di float che devo usare per riempire una struttura con lo stesso numero di float. Poiché lo scopo di questa libreria è di inviare messaggi su Ethernet, ho solo bisogno di fare l'iterazione due volte - una volta sull'invio e una sulla ricezione. Tutte le altre volte, questi dati vengono archiviati come una matrice. Lo so - dovrei serializzare gli array e inviarli così com'è, ma lo ripeto - assolutamente non posso.
Ho un float[1024]
, e deve scorrere l'array e compilare il seguente struct:
struct pseudovector
{
float data1;
float data2;
float data3;
...
float data1024;
}
sto già generando questa struct con BOOST_PP_REPEAT e BOOST_PP_SEQ_FOR_EACH_I in modo che io non devo scrivere tutte le 1024 carri e aumenta la manutenibilità/estensibilità.
Allo stesso modo, ho provato scorrendo la struct tramite pre-compilatore ##
concatination (https://stackoverflow.com/a/29020943/2066079), ma come questo è fatto in fase di pre-compilatore, non può essere utilizzato per runtime ottenere/impostazione.
Ho esaminato l'implementazione di reflection come How can I add reflection to a C++ application? e Ponder Library, ma entrambi gli approcci richiedono di scrivere esplicitamente ciascun elemento su cui è possibile riflettere. In quel caso, potrei anche solo creare un std::map<string, float>
e iterare in un ciclo for tramite stringa/integer concatenazione:
for(i=0;i<1024;i++)
{
array[i] = map.get(std::string("data")+(i+1))
}
Qualcuno può consigliare una soluzione più pulita che non mi richiede di scrivere al di sopra di 1024 linee di codice? Il tuo aiuto è apprezzato!
Di nuovo, ripeto - Non posso assolutamente utilizzare una matrice/vettore di qualsiasi tipo.
questo sembra anti-pattern. potresti avvolgere questa struttura in un sindacato? 'union wrapper {float arr [1024]; pseudovettore vec; }; ' – vu1p3n0x
Perché non solo ' float [1024] fa; pseudovettore pv; memcpy (fa, & pv, sizeof (pv)); '? –
@ c-smile Perché si tratta di comportamento non definito – dberm22