2014-01-14 4 views
2

Есть ли в любом случае fusion :: for_each() для итерации через a1 и a2 в BOOST_FUSION_ADAPT_ADT или BOOST_FUSION_ADAPT_ASSOC_ADT, как если бы они были адаптированы с использованием 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 macro. Каждый элемент должен быть объявлен с помощью 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

 Смежные вопросы

  • Нет связанных вопросов^_^