2014-01-14 180 views
2

有沒有反正fusion :: for_each()來遍歷BOOST_FUSION_ADAPT_ADT或BOOST_FUSION_ADAPT_ASSOC_ADT中的a1和a2,就像使用BOOST_FUSION_ADAPT_STRUCT調整一樣?迭代BOOST_FUSION_ADAPT_ADT結構中的元素?

class A 
{ 
private: 
    int a1_; 
    double a2_; 

public: 
    void set_a1(int v) { a1_ = v; } 
    int get_a1() const { return a1_; } 

    void set_a2(double v) { a2_ = v; } 
    double get_a2() const { return a2_; } 
}; 

BOOST_FUSION_ADAPT_ASSOC_ADT(
    A, 
    (int, int, obj.get_a1(), obj.set_a1(val)) 
    (double, double, obj.get_a2(), obj.set_a2(val)) 
) 

struct Print 
{ 
    template <typename T> 
    void operator()(T& t) const 
    { 
     // T is of type adt_attribute_proxy 
     // cout << ?? 
     // would like to print a1 and a2 value 
    } 
}; 

int main() 
{ 
    A a; 
    boost::fusion::for_each(a, Print()); 
} 

回答

2

adt_attribute_proxy提供了訪問屬性值的方法get

struct Print 
{ 

    template <typename T> 
    void operator()(T& t) const 
    { 
     std::cout << t.get(); 
    } 
}; 

P.S.您在示例BOOST_FUSION_ADAPT_ASSOC_ADT宏中存在錯誤。每個元素應聲明5個參數(attribute_typeN,attribute_const_typeN,get_exprN,set_exprN,key_typeN)也許你混淆了BOOST_FUSION_ADAPT_ASSOC_ADT和BOOST_FUSION_ADAPT_ADT?

+0

謝謝!我不能相信答案就是這麼簡單的電話。我查看了這個鏈接(http://www.boost.org/doc/libs/1_55_0/libs/fusion/doc/html/fusion/notes.html#fusion.notes.adt_attribute_proxy),但無法明白是的。 – surfcode

+0

不客氣:) – sliser

+0

對不起,那麼有沒有辦法獲得t.get()的類型?我在文檔中看到「proxy_typeN :: type」。但無法理解... – surfcode