2012-12-15 4 views
6

Herhangi bir yapı veya sınıfı bir tuple dönüştürmek için şablon meta-programlama kullanmak mümkün mü? ÖrneğinTMP: Herhangi bir yapıyı bir tuple dönüştüren şablon kodu nasıl yazılır?

:

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

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

automagically benim için Foo_Tuple üretecektir bazı şablon kodu olması güzel olurdu.

CEVAP

Bu Böyle basit bir durum için overkill, ancak daha detaylı durumlarda (örn ORM veya herhangi zaman için kazan-plaka kodunun çok yazmak gerekiyor ve sadece şablon veya makro olduğu görev için yetersiz), Boost Mirror oldukça yararlı olabilir gibi görünüyor. Boost Mirror'a biraz daha kazdım: Temel yansıtma işlevselliği (Ayna ve Puddle'da) anlamak zor değil, kurulumu oldukça kolaydır ve oldukça kapsamlı görünmektedir (C++ 11 dahil olmak üzere birçok yapıyı ele alabilir) enum dersleri, vb ...). Bu temel işlevselliği fazlasıyla yeterli buluyorum - MACROS'u sınıflarımın Yansıma'ya yansıtılmasını istediğim kadar kullanabilirim (böylelikle kazan-plakası kodunu yazmak zorunda kalmam). Fabrika jeneratörleri de çok güçlü görünüyor (aynı başlangıç ​​makroları ile, JSON, SOCI ya da bir akış vb. Çıkışını yapmak istediğiniz herhangi bir fabrika jeneratöründe değiştirilebilir), ancak daha büyük bir öğrenme eğrisi var. kendi fabrika jeneratörlerini yazmak istiyorsanız, kurulum. Son bir iki not: biraz küçük tweaks ile, gcc 4.7.2 üzerinde C++ 11 ile çalışmayı başarabiliyordum; Ayrıca, dokümantasyon iyi bir şekilde Oksijenlenmiş ve hızlı bir şekilde ilerlemek için yeterli örnek var gibi görünüyor.

+0

'std :: tuple ' hehe – Pubby

+0

ben yüksek sesle öneren mahkum olacak biliyorum ama çoğu platformlarda çalışacak reinterpret_cast' Bu durumda 'in düşünüyorum:

İşte böyle bir makale. –

+1

@JamesBrock Boo! Hiss! [Öneriniz kötü ve kendinizi kötü hissetmelisiniz] (http://www.youtube.com/watch?v=jG2KMkQLZmI)! –

cevap

6

Bunu C++'da yapmanın bir yolu olduğunu sanmıyorum.

Bir yapıdaki alanları/türleri sıralamanın bir yolunu bilmiyorum - bunu yapabilseydiniz, bu tür bir tuple oluşturmanın oldukça basit olacağını düşünürdüm.

Boost.Fusion'un bu FUSION_ADAPT_STRUCT adlı yardımcı olan bir makroya sahip olduğuna inanıyorum, ancak hepsi bu kılavuzdur.

Bu teknik terim "yansıma" dır ve "C++ yansıması" aranarak bu konuda birçok bilgi bulabilirsiniz. How can I add reflection to a C++ application?

+0

+1 içgörü ve yararlı bağlantılar – kfmfe04

+0

, C++ yansımasını aldıkça, bu kitaplıkların bir kısmı (en azından boilerplate kodunun önüne geçecektir) yapacaktır. – kfmfe04

İlgili konular