2012-06-04 21 views
8

Sorunun başlığı uygun olduğundan emin değilim. İşte problem. Bazı C++ 11 kütüphane özelliklerini kullanan bir kütüphane yazıyorum. Açıkçası, tüm uygulamaların bu kütüphaneleri desteklemediği ve bu nedenle taşınabilirlik problemi olduğu söylenemez. Burada hangi kütüphanenin ilgilendiği önemli değildir. Bir çözüm zaten çok fazla C++ 11 kütüphanesi sağlayan takviye kullanmaktır. Bu yüzden benim çözümüm, bir makro tanımlamaktır, USE_CXX11 deyin ve internal adında yeni bir ad alanı tanımlayın ve isimleri makrolara bağlı olarak bu iç ad alanına girin. Mesela,isimli birC++ kütüphanesinden <boost/foo/foo.hpp> numaralı telefondan da kullanılabilir. Ne yapmamC++ sarmalayıcı için boost/C++ 11

#ifdef USE_CXX11 
#include <foo> 
#else 
#include <boost/foo/foo.hpp> 
#endif 

namespace internal { 
#ifdef USE_CXX11 
using std::foo; 
#else 
using boost::foo::foo; 
#endif 
} 

Ve kütüphanede geri kalanında sadece internal::foo kullanın. Bu kitaplığı kullanan üçüncü taraf kodu, çalışan bir C++ 11 uygulamasının olup olmadığını göstermek için uygun makroyu tanımlayabilir veya yalnızca artırmayı kullanabilir. Ve kütüphanem sağ üstbilgi ve ad alanı alacak. Bu şimdiye kadar çalışıyor. Umarım niyetimi iyi açıkladım. Ancak, yukarıdaki çözümler bana çok çirkin görünüyor. Bu tür şeyler için daha iyi bir uygulama var mı? Yoksa bu yaklaşımın işe yaramayacağı muhtemel durumlar var mı?

+1

Kontrol dışarı Boost.Algorithms kütüphanede (yaklaşan 1.50 sürümde yeni) ** Boost.TR1 ** –

+3

o Kuvvetlendirme ve sen desteklemek gerekiyorsa güncel olmayan derleyiciler, sadece Boost doğrudan kullanın. –

+0

Neden destek kullanmıyorsunuz? – fbafelipe

cevap

5

Çözümünüz bana iyi geliyor; Boost ve C++ 11 arayüzleri ve/veya uygulamalarının farklı olduğu durumlarda tek sorun (Chet'in belirttiği gibi) olacaktır.

Aslında, benim yaptığım o

namespace boost { namespace algorithm { 
#if __cplusplus >= 201103L 
using std::find_if_not;  // Section 25.2.5 
#else 
template<typename InputIterator, typename Predicate> 
InputIterator find_if_not (InputIterator first, InputIterator last, Predicate p) 
{ 
    for (; first != last; ++first) 
     if (!p(*first)) 
      break; 
    return first; 
} 
#endif 
}} 
2

Bunu uygulanabilir bir çözüm olarak görmüyorum. Sınıflar arasında koşullu olarak geçiş, kullanımını yalnızca aynı imzalara ve semantiklere sahip olan üye işlevleri ile sınırlayacaktır. Ayrıca, pek çok geliştiricinin doğal olmadığını düşündüğü Standart Kitaplığa erişimi yeniden yönlendiriyorsunuz.

Eğer kullanılabilirlik C++ 03 ve C++ 11 arasında bir endişe ise, o zaman kesinlikle her şey için Boost ile gitmelisiniz. Eğer C++ 11 sizin tek hedefinizse, destekledikleri dil ve kütüphane özelliklerini görmek için çeşitli derleyicileri değerlendirerek daha iyi bir başarı elde edebilirsiniz. İyi desteklenmiş ve hatasız olarak kabul edilenleri seçin. Diğer her şey için daha fazla C++ 11 kitaplık özelliklerini desteklemek için gerekirse Yükseltme ve daha sonra refactor kullanın. Kütüphaneleri aralarında değiştirmek yerine birbiri ardına kullanmanız çok daha iyi olacaktır.

GCC's C++ Standard Library implementation durum sayfasından bir başlangıç ​​alabilirsiniz.