2012-12-15 60 views
6

是否可以使用模板元編程將任何結構或類轉換爲元組?TMP:如何編寫將任何結構轉換爲元組的模板代碼?

例如:

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

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

這將是很好有一些模板代碼,這將產生Foo_Tuple自動地對我。

ANSWER

這是矯枉過正這樣一個簡單的例子,但對於更復雜的情況下(如ORM或任何時候,你需要寫很多的樣板代碼,僅僅模板或宏不足以完成任務),Boost Mirror看起來可能非常有用。我已經深入瞭解Boost Mirror:基本的反射功能(在Mirror和Puddle中)不難理解,設置起來很容易,而且看起來相當廣泛(可以處理許多構造,包括C++ 11枚舉類等)。我發現這個基本功能已經足夠了 - 我只需要使用MACROS就可以將我的類暴露給Reflection(這樣我就不必編寫boiler-plate代碼)。工廠生成器似乎也非常強大(使用相同的初始宏設置,你可以交換任何你喜歡的工廠生成器來輸出JSON,SOCI或流等),但是具有更大的學習曲線/設置,如果你想寫你自己的工廠生成器。最後幾個注意事項:通過一些小的調整,我能夠在gcc 4.7.2上使用C++ 11;此外,文檔已經很好地充實了,並且似乎有足夠的例子可以快速實現。

+0

'的std ::元組'嘿嘿 – Pubby

+0

我知道我會大聲地譴責建議,但我認爲在這種情況下'reinterpret_cast'將在大多數平臺上工作。 –

+1

@JamesBrock Boo!嘶! [你的建議不好,你應該感覺不好](http://www.youtube.com/watch?v=jG2KMkQLZmI)! –

回答

6

我不認爲有一種方法可以在C++中執行此操作。

我不知道一種方法來枚舉結構中的字段/類型 - 如果你可以這樣做,我會認爲構造這樣一個元組會很簡單。

我相信Boost.Fusion有一個可以幫助這個被稱爲FUSION_ADAPT_STRUCT的宏,但這都是手動的。

這個技術術語是「反射」,你可以通過搜索「C++反射」來找到關於它的大量信息。

這裏有一個這樣的文章:How can I add reflection to a C++ application?

+0

+1瞭解和有用的鏈接 – kfmfe04

+0

看起來像,直到C++得到反射,這些庫中的一些會做(至少它會阻止噸樣板代碼)。 – kfmfe04

相關問題