2012-12-15 8 views
6

È 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.

+0

'std :: tuple ' hehe – Pubby

+0

So che sarò a gran voce condannato per il suggerimento, ma credo che in questo caso 'reinterpret_cast' funzionerà sulla maggior parte delle piattaforme. –

+1

@JamesBrock Boo! Sibilo! [Il tuo suggerimento è brutto e dovresti sentirti male] (http://www.youtube.com/watch?v=jG2KMkQLZmI)! –

risposta

6

Non penso che ci sia un modo per farlo in C++.

Non conosco un modo per enumerare i campi/tipi in una struttura - se potessi farlo, penserei che la costruzione di una tale tupla sarebbe piuttosto semplice.

Credo che Boost.Fusion abbia una macro che aiuta con questo chiamato FUSION_ADAPT_STRUCT, ma questo è tutto manuale.

Il termine tecnico per questo è "riflessione" e puoi trovare molte informazioni a riguardo cercando "Riflessione C++".

Ecco uno di questi articoli: How can I add reflection to a C++ application?

+0

+1 per approfondimenti e link utili – kfmfe04

+0

sembra che fino a quando C++ non avrà riflesso, alcune di queste librerie lo faranno (almeno impediranno tonnellate di codice boilerplate). – kfmfe04

Problemi correlati