14 Aralık 2017 Perşembe

fusion traits

Örnek
Elimizde şu kod olsun.
#include <boost/fusion/include/adapted.hpp>

struct cat {
  int tail;
  int head;
};

struct bird {
  int wing;
  int cloaca;
};

struct wat {
  cat _cat;
  bird _bird;
};

BOOST_FUSION_ADAPT_STRUCT(cat, tail, head)
BOOST_FUSION_ADAPT_STRUCT(bird, wing, cloaca)
BOOST_FUSION_ADAPT_STRUCT(wat, _cat, _bird)
Her alanı dolaşmak için şöyle yaparız.
template <typename T, int N = 0>
void print(T const& obj) {
  namespace fus = boost::fusion;
  if constexpr (fus::traits::is_sequence<T>::value) {
    if (N==0)
      std::cout << "{";

    if constexpr (N < fus::size(obj).value) {
      auto name = boost::fusion::extension::struct_member_name<T, N>::call();
      std::cout << ' ' << name << '=';
      print(fus::at_c<N>(obj));
      std::cout << ';';
      print<T, N+1>(obj);
    } else {
      std::cout << " }";
    }
  } else {
    std::cout << obj;
  }
}
Çağırmak için şöyle yaparız.
print(wat { {1,2}, {3,4} });
Çıktı olarak şunu alırız.
{ _cat={ tail=1; head=2; }; _bird={ wing=3; cloaca=4; }; }



Hiç yorum yok:

Yorum Gönder