2010-06-01 47 views
7

Derleyicimin variadic şablonlarını destekleyip desteklemediğini bana bildiren bir makro var mı?Variadic şablonlarını koşullu olarak nasıl derlerim?

#ifdef VARIADIC_TEMPLATES_AVAILABLE 

template<typename... Args> void coolstuff(Args&&... args); 

#else 

??? 

#endif 

Desteklenmiyorlarsa, sanırım onları bir sürü aşırı yüklenmeyle simüle edebilirim. Daha iyi bir fikir var mı? Belki işi kolaylaştıracak önişlemci kütüphaneleri var mıdır?

cevap

7

görünüyor eğer değişken şablonlar mevcut değilse. Bu, boost/config.hpp; config.hpp belgeleri için bkz. here. variadic şablonlar kullanılamıyorsa dediğin gibi

, o zaman muhtemelen aşırı bir grup ile onlara simüle etmek gerekecek. Boost.Preprocessor kitaplığı burada yardımcı olabilir; şablon aşırı yükleri de dahil olmak üzere her türlü tekrarlayan kaynak kodunu otomatikleştirmek için tasarlanmıştır. Variadic şablonları simüle etmek için kullanmayla ilgili örnekler için Boost kaynak ağaçlarını BOOST_NO_VARIADIC_TEMPLATES için arayabilirsiniz. yani bir `Boost.Fusion` kabın içine parametreleri sarar Boost.Preprocessor çeşitli arities sayesinde birçok aşırı (tuple, vektör, vb ...) ile bir arayüz teklif:

+1

Ben Niels ile Yaklaşımınızı birleştirmek istiyorum daha sonra, gerçek uygulamanın yapıldığı tek bir şablon sınıfına geçilir. Fikir sadece hata ayıklama kolaylaştırmak için makrolarda kod miktarını azaltmak için :) –

8

Belki: #ifndef BOOST_NO_VARIADIC_TEMPLATES?


variadic şablonlar desteklenmez ise, boost tuple kütüphanelerini kullanmak düşünebilir:

template<typename Tuple> void coolstuff(Tuple&& args); 

Ve: Boost geçerli sürümü BOOST_NO_VARIADIC_TEMPLATES tanımlar gibi

coolstuff(boost::make_tuple(1, 2, 3)); 
İlgili konular