È possibile utilizzare la meta-programmazione del modello per convertire qualsiasi struttura o classe in una tupla?TMP: come scrivere il codice del modello che converte qualsiasi struttura in una tupla?
Per esempio:
struct Foo
{
char c;
int i;
std::string s;
};
typedef std::tuple< char, int, std::string > Foo_Tuple;
Sarebbe bello avere un po 'di codice template che genererà Foo_Tuple automagicamente per me.
RISPOSTA
questo è eccessivo per un caso così semplice, ma per i casi più complessi (ad esempio ORM o in qualsiasi momento avete bisogno di scrivere un sacco di codice caldaia-piatto, e un semplice modello o macro è inadeguato per il compito), Boost Mirror sembra che possa essere estremamente utile. Ho scavato un po 'di più in Boost Mirror: le funzionalità di riflessione di base (in Mirror and Puddle) non sono difficili da comprendere, sono abbastanza facili da configurare e sembrano abbastanza estese (possono gestire molti costrutti, incluso C++ 11 classi enum, ecc ...). Trovo che questa funzionalità di base sia più che adeguata - posso semplicemente usare il MACROS nella misura in cui voglio esporre le mie classi a Reflection (in modo da non dover scrivere il codice della piastra della caldaia). I generatori Factory sembrano anche molto potenti (con le stesse macro iniziali configurate, puoi scambiare qualsiasi generatore di factory che desideri generare JSON, SOCI, o uno stream ecc ...), ma ha una curva di apprendimento più ampia/configurazione, se si desidera scrivere i propri generatori di fabbrica. Un ultimo paio di note: con alcune piccole modifiche, sono riuscito a farlo funzionare con C++ 11 su gcc 4.7.2; inoltre, la documentazione è stata ben DOxygenated e sembrano esserci più esempi sufficienti per andare avanti rapidamente.
'std :: tuple' hehe –
Pubby
So che sarò a gran voce condannato per il suggerimento, ma credo che in questo caso 'reinterpret_cast' funzionerà sulla maggior parte delle piattaforme. –
@JamesBrock Boo! Sibilo! [Il tuo suggerimento è brutto e dovresti sentirti male] (http://www.youtube.com/watch?v=jG2KMkQLZmI)! –