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
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.
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.
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.
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.Fusion. Boost.Variant, bence, ayrıca buna bağlı olabilir
Sen unknowningly zaten kullanabilir :)
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
boost.proto, boost.spirit (qi, karma, lex) ... aslında diğer destek kütüphanelerinin çoğunda ... –
şey yaptım: https://github.com/edubois/static-factorial/blob/master/main.cpp
O
Bunu anlamak için yardımcı olabilir ... statik olarak faktöryel < 8>() değerini hesaplamak için boost :: mpl küçücük bir bölümünü kullanır ana fikir.
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
>;
};
};
Bozuk linkler ve aldatma :( – Quentin
Kütüphane kapalı github almak zorunda kaldı. – rmccabe3701
- 1. Dispatcher.DisableProcessing için pratik kullanım mı?
- 2. Bash dizisinin pratik kullanımı
- 3. Java-apache http istemci kullanım örnekleri, HTTPResponse nesnesinden
- 4. Pratik Bilgiler
- 5. C++ Boost - iOS ve Android'de kullanım için nasıl kurulur
- 6. Boost :: asio ve boost :: thread
- 7. boost :: range_iterator ve boost :: iterator_range karışıklığı
- 8. Pratik SQL Sorguları
- 9. Pratik Bilgiler Scala
- 10. Arabirim olaylarının pratik kullanımı
- 11. Pratik C++ Metaprogramlama
- 12. Pratik Bilgiler Kaldırma RVM
- 13. Dinamik yöntemin pratik örneği?
- 14. Basit Nesne - Pratik Örnek
- 15. Pip ve conda arasındaki pratik fark
- 16. Boost
- 17. İki destek toplamı :: accumulator_set örnekleri
- 18. Kullanım
- 19. Kullanım
- 20. boost :: tokenizer vs boost :: bölme
- 21. HttpSessionBindingListener'ın ve HttpSessionAttributeListener'ın Pratik Kullanımı
- 22. Pratik için Visual Sourcesafe sunucusu
- 23. clojure'un dinamik vars ve bağlamalarının pratik amacı nedir?
- 24. Google BigQuery with .NET belgeleri/örnekleri
- 25. örnekleri istemci tarafı auth herhangi örnekleri reaksiyona için var
- 26. boost :: function and boost :: bind work
- 27. boost :: boost :: throw_exception nedeniyle derleme yapılamıyor ::
- 28. Tek tek Boost kütüphaneleri ile derleme, Boost
- 29. VB.NET lambda ifadesinin örnekleri
- 30. Google Breakpad örnekleri
Sanırım soru Boost.MPL ile ilgili ve genel olarak metaprogramlama değil. – jalf
MPL hakkında, ona yönelen her şey olmadan konuşamazsınız. –
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