7 Şubat 2018 Çarşamba

fusion BOOST_FUSION_ADAPT_STRUCT

Giriş
Şu satırı dahil ederiz.
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/include/io.hpp>
BOOST_FUSION_ADAPT_STRUCT bir macro.
Composition
Inheritance ile çalışmaz ancak composition ile çalışır.
Örnek
Elimizde şu kod olsun.
struct cat
{
  int tail;
  int head;
};

struct bird
{
  int wing;
  int bursa;
};
Şu kod derlenmez.
struct wat : public cat, public bird
{

};

BOOST_FUSION_ADAPT_STRUCT(cat,tail,head)
BOOST_FUSION_ADAPT_STRUCT(bird, wing, bursa)
BOOST_FUSION_ADAPT_STRUCT(wat, wat::cat, wat::bird)
Örnek
Şöyle yaparız.
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)
Örnek - erişim sırasını değiştirmek
Erişim sırasını değiştirmek içinş şöyle yaparız.
struct MyStruct { int a, b, c; };
BOOST_FUSION_ADAPT_STRUCT(MyStruct, c, b, a)
Elimde şöyle değişken olsun.
MyStruct { 3, 2, 1 }
Değişken içinde a = 3 iken fusion içinde sırayla dolaşırken 1,2,3 çıktısını alırız. Yani döngüde önce c alanı gelir ve değeri doğru şekilde 1'dir.

Örnek - boost::optional
Şöyle yaparız.
struct MyStruct {
  boost::optional<std::string> one;
  boost::optional<int> two;
  boost::optional<double> three;
};

BOOST_FUSION_ADAPT_STRUCT(MyStruct, one, two, three)
Örnek - enum
Şöyle yaparız. Böylece fusion << operatorü ile yazılabilen bir struct elde ederiz.
struct Struct {
  enum class Type {
    A,B
  };
  Type type;
  int value;
};
BOOST_FUSION_ADAPT_STRUCT(Struct, type, value);
Örnek - std::vector
Şöyle yaparız.
namespace model
{

  struct spectrum {
    std::string comment;
    std::string file;
    std::string nativeId;
    double      precursorMz;
    int         precursorCharge;
    double      precursorIntensity;
  };

  struct cluster {
    std::string           id;
    std::vector<spectrum> spectra;
  };
}

BOOST_FUSION_ADAPT_STRUCT(model::spectrum, comment, file, nativeId, precursorMz,
  precursorCharge, precursorIntensity)
BOOST_FUSION_ADAPT_STRUCT(model::cluster, id, spectra)

Hiç yorum yok:

Yorum Gönder