2011-01-09 12 views
23

Boost::MPL kullanımının (lambdas hariç) gerçek dünyadaki tüm örneklerini, amaçlarını ve pratik kullanım alanlarını daha iyi anlamama olanak tanımak için paylaşabilir misiniz? MPL dökümantasyonu öğreticisi bir dimensional analysis örneğine sahiptir, ancak belki de bu bir akademik örnek olduğu için bana Boost :: MPL hissi vermediğinden ve etkin bir şekilde kullanılabileceğinden dolayı.Boost :: MPL'nin pratik kullanım örnekleri

cevap

11

Varyant benzeri sınıflar oluşturmak için Boost.Mpl kullanıyorum. Bu gibi bir MPL türü listesi verilen Örneğin

:

typedef boost::mpl::set<Foo, Bar, Baz> type_set; 

Daha sonra her birisi de diğerlerinden türetilen sınıflardan bir zinciri oluşturmak üzere boost::mpl::fold kullanan her tür türlerinden biri bir std::unordered_set ekler ayarlayın. Son sonuç, unordered_set<Foo>, unordered_set<Bar> ve unordered_set<Baz> içeren bir sınıftır.

ve sınıf boost::mpl::set açısından belirtilir, çünkü otomatik olarak, örneğin unordered_set s her karşılaştıran bir operator== gibi diğer fonksiyonları oluşturmak için bu tür yineleme olabilir.

4

Boost.Units adlı daha gelişmiş boyutlu bir analiz kitaplığı kullanıyorum.

Derleme zamanı yansıma kitaplığı geliştirdim ve sonra bu kütüphaneyi, tüm derleme zamanı yansıtılan türüne çalışma zamanı yansıtma sağlayan bir genel sınıf oluşturmak için kullandım. Bu desteği otomatik olarak UI bileşenleri oluşturmak için kullandım yansıyan türlerin özelliklerini düzenlemek.

Ayrıca bizim uygulama içinde olayların dağılımı için her şeyden var. Örneğin, birisi sistemin içinde olmasını istediği birimleri değiştirdiğinde, bu sisteme yeni cihazların eklendiğini öğretmek zorunda değilim çünkü kod bu türleri analiz etmek için MPL kullanıyor ve sadece bir şeyler eklendiğini biliyor. ve değiştirir.

Ben sadece onların sistemi tarafından kaldırılan tip güvenliğini yeniden kazanır ve herhangi işlevsel varlık ile bağlantı yapabiliyor şey haline Qt sinyallerini tamamlamayı metaprogramming teknikleri kullandık.

gerçeği söylemek Ama

, neredeyse kesinlikle pratik kullanılan bu sıralamada gibi standart algoritmaları kullandım zaman zaten metaprogramming tekniklerini uyguladık. Sıralama algoritmasının iyi bir şekilde uygulanması, geçirilen yineleyicileri analiz etmek için daha az gelişmiş bir metaprogramlama biçimi kullanır ve daha sonra bu yineleyicilerin özelliklerini tam olarak kullanabilen bir sıralama algoritmasını başlatmak için etiket gönderimini kullanır.

Açıkçası o zaman C++ gücünü kullanan değiliz metaprogramming yapmıyoruz ve siz de başka bir şey kullanıyor olabilir eğer.

+2

Sanırım soru Boost.MPL ile ilgili ve genel olarak metaprogramlama değil. – jalf

+0

MPL hakkında, ona yönelen her şey olmadan konuşamazsınız. –

+2

ama "Bir araba kullanıyor musunuz?" Diye sormadan "bir Volvo kullanıyorsunuz" gibi aynı şekilde "şablon meta programlamasının başka bir örneğini kullanıyorsunuz" sormadan "Boost.MPL kullanıyor musunuz?" " – jalf

13

gerçeği Boost.MPL, Boost.Preprocessor gibi gerçekten bloklar inşa ediyoruz vardır. Boost kütüphaneleri bir dizi bu ikisinin üzerine inşa gibi

Çoğu kez

, muhtemelen, diğer kütüphanelerin aracılığıyla kullanabilirsiniz. Örneğin

: (daha kolay bir arayüzü)

  • Boost.MultiIndex
  • Boost (derleme zamanında ve kullanım sırasında alemleri arasındaki boşlukları sahasına)

    • Boost.Fusion.
    • Boost.Variant, bence, ayrıca buna bağlı olabilir

    Sen unknowningly zaten kullanabilir :)

  • 3

    Matthieu cevabı eklemek için (boyutsal analiz için) Birim, aynı zamanda oldukça yaygın kullanılan Hem Boost.Python ve Luabind boyunca. komik

    +1

    boost.proto, boost.spirit (qi, karma, lex) ... aslında diğer destek kütüphanelerinin çoğunda ... –

    3

    stat_log kütüphanemde boost :: mpl (ve boost :: fusion) alanını yoğun olarak kullanıyorum. Bu kitaplık, kullanıcının istatistik ve günlük etiketlerinin hiyerarşisini ve ilişkili davranışlarını, yani etiket başına istatistik türlerini (histogram, sayaç vb.) Belirtmesine izin verir.

    Ben kullanıcı ile doğru olanı yapmak için metaprogramlama temeline dayanmaktadır yapar: Örneğin

    stat_log::writeStat<IP_PKTS_RCVD>(450); 
    

    kullanıcı tipi özelliği tanımlıyorsa:

    template <> 
    struct stat_tag_to_type<IP_PKTS_RCVD> 
    { 
        using type = Accumulator< 
         stat_log::HistogramCount< 
          int, 
          1, //start bin 
          1500, //stop bin 
          10 //num_bits 
         > 
        >; 
    }; 
    

    "writeStat" yukarıda olacak diyoruz Proxy (derleme zamanında) bir histogram istatistiğine. Bu tasarım tekniğinin güçlü yönü, "writeStat" çağrı sitesi, seçilen belirli bir istatistikle hiç bağlantılı değildir.

    Ayrıca istatistikleri görüntülemek için bol miktarda MPL ve boost :: fusion kullanın. Sorunuzun Başına, boost :: mpl en yüksek konsantrasyonu için aşağıdaki dosyaları bakın:

    https://github.com/rjmccabe3701/stat_log/blob/master/include/stat_log/util/stat_log_impl.h https://github.com/rjmccabe3701/stat_log/blob/master/include/stat_log/util/tag_commander.h https://github.com/rjmccabe3701/stat_log/blob/master/include/stat_log/stat_log.h

    özellikle stat_log_impl.h içinde şık şablon meta "fonksiyonu":

    //This template is used in conjunction with an MPL algorithm 
    // with the same semantics as mpl::find_if. 
    //BoolFunc is the "condition" metafunction. 
    //StatTagFunc is a metafunction that transforms the given 
    // stat_tag into something the algorithm requires. 
    // For example the "Identity" metafunction would work here. 
    //StatTagArgs is extra arguments to the BoolFunc 
    template <template<typename...> class BoolFunc, 
          template<typename...> class StatTagFunc, 
          class... StatTagArgs> 
    struct tag_node_query 
    { 
        template<typename TheTagNode> 
        struct apply 
        { 
         using stat_tag = typename TheTagNode::tag; 
         using type = std::integral_constant 
         < 
          bool, 
          BoolFunc< 
           typename StatTagFunc<stat_tag>::type, 
           StatTagArgs... 
          >::value 
         >; 
        }; 
    }; 
    
    +0

    Bozuk linkler ve aldatma :( – Quentin

    +0

    Kütüphane kapalı github almak zorunda kaldı. – rmccabe3701