2012-12-15 7 views
6

Czy można użyć szablonu meta-programowania do konwersji dowolnej struktury lub klasy na krotkę?TMP: jak napisać kod szablonu, który przekształca dowolną strukturę w krotkę?

Na przykład:

struct Foo 
{ 
    char   c; 
    int   i; 
    std::string s; 
}; 

typedef std::tuple< char, int, std::string > Foo_Tuple; 

Byłoby miło mieć jakiś kod szablonu, który wygeneruje Foo_Tuple automagicznie dla mnie.

ODPOWIEDŹ

To jest przesadą dla tak prostej sprawy, ale w przypadku bardziej skomplikowanych przypadkach (np ORM lub dowolnym czasie trzeba napisać dużo kodu kocioł-płyty, a jedynie szablon lub makro jest niewystarczające do wykonania zadania), Boost Mirror wygląda na to, że może być bardzo użyteczny. Zagłębiłem się w Boost Mirror nieco bardziej: podstawowa funkcja odbicia (w Mirror i Puddle) nie jest trudna do zrozumienia, jest dość łatwa do skonfigurowania i wydaje się dość obszerna (potrafi obsłużyć wiele konstrukcji, w tym C++ 11 wyliczanie klas, itp.). Uważam, że ta podstawowa funkcjonalność jest więcej niż wystarczająca - mogę po prostu użyć MAKROSów do tego stopnia, że ​​chcę ujawnić moje klasy Reflection (tak, że nie muszę pisać kodu płyty kotła). Generatory Factory również wydają się być bardzo potężne (z tymi samymi początkowymi ustawieniami makr, możesz zamienić dowolny generator fabryczny, który chcesz wyprowadzić JSON, SOCI lub strumień itp.), Ale ma on większą krzywą uczenia się/konfiguracji, jeśli chcesz napisać własne generatory fabryczne. Jedna ostatnia para notatek: z kilkoma drobnymi zmianami, byłem w stanie zmusić go do pracy z C++ 11 na gcc 4.7.2; również dokumentacja była dobrze doxygenated i wydaje się, że więcej niż wystarczające przykłady, aby szybko iść.

+0

'std :: krotka ' hehe – Pubby

+0

wiem będę głośno skazany za sugestię, ale myślę, że w tym przypadku 'reinterpret_cast' będzie działać na większości platform. –

+1

@JamesBrock Boo! Syk! [Twoja sugestia jest zła i powinieneś czuć się źle] (http://www.youtube.com/watch?v=jG2KMkQLZmI)! –

Odpowiedz

6

Nie sądzę, że jest sposób, aby to zrobić w C++.

Nie wiem, jak wyliczyć pola/typy w strukturze - gdybyś mógł to zrobić, pomyślałbym, że skonstruowanie takiej krotki byłoby dość proste.

Wierzę, że Boost.Fusion ma makro, które pomaga w tym o nazwie FUSION_ADAPT_STRUCT, ale to wszystko jest ręczne.

Technicznym terminem na to jest "odbicie", a można znaleźć wiele informacji na ten temat, wyszukując "odbicie C++".

Oto jeden taki artykuł: How can I add reflection to a C++ application?

+0

+1 dla wglądu i przydatne linki – kfmfe04

+0

wygląda tak, aż C++ zostanie odbite, niektóre z tych bibliotek wykonają (przynajmniej zapobiegnie to tonowi kodu). – kfmfe04

Powiązane problemy