2014-01-14 151 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