2013-06-30 36 views
3

我想知道如何正確循環一個普通的舊數據類型的成員,以獲得他們的一些類型信息。那就是:循環POD成員

struct my_pod 
{ 
    int a; 
    double b; 
}; 

template<typename POD> 
void loopOverPOD() 
{ 
    for_each(POD, member) // The magic part 
    { 
     // member::type should be for my_pod int, then double 
     typename member::type i; 
     // member::size_of should be equal to sizeof(int) then sizeof(double) 
     // Trivial if we can have member::type information. 
     int size = member::size_of; 
     // member::offset_of should be equal to 0, then sizeof(int) 
     // Trivial if we can have member::size_of information. 
     int offset = member::offset_of; 
    } 
} 

據我所知,在C++中,我們不能做簡單的類型內省而不做一些棘手的戲劇與模板。但在這裏,我無法找到具體的解決方案,即使事實上使用了宏。問題更多的是關於我而不是解決方案的存在。 :-)

我不一定要求一個不會侵入的解決方案。

在此先感謝。

+1

這是不可能做 –

+1

你有沒有考慮過使用['std :: tuple'](http://en.cppreference.com/w/cpp/utility/tuple)而不是POD類型。 –

+0

@CaptainObvlious是否std :: tuple是POD,如果與POD模板參數一起使用? – Nemikolh

回答

3

您可以使用boost.fusions 將您的POD轉換爲序列,然後使用融合for_each將函數對象應用於每個成員。這是非侵入性的,你的POD類型將保持POD。

好的是,您甚至可以將ADAPT_STRUCT宏放入與您的結構定義分開的(header-)文件中,並且只在需要迭代的代碼中使用它們。

另一方面,這個宏需要重複提及成員的類型和名稱。我想在某些時候,融合將使用C++ 11功能來擺脫冗餘(再次提及類型)。同時,可以創建一個聲明結構和ADAP_STRUCT部分的宏。

+0

正是我需要的!非常感謝。即使宏被說成是邪惡的,但對於POD類型來說,它們看起來並不那麼邪惡。 – Nemikolh

0

C++沒有構造來遍歷結構的成員。

然而,存在一個標準類型std::tuple,您可以使用模板在編譯時遞歸遍歷其元素。