Benim C ++ programlarında türev araçlarının ve geriye doğru uyumluluk düzeyi tutmak ise bir iyiliği için çalışıyoruz Sonunda bunun dışında bir kütüphane araç yapmak zorunda dek , ben serbest bırakılması için hazırlık yapıyorum zaten serbest bırakıldı. Genel olarak, sözdiziminde olmayan özelliklerde (bazı şeyler ileriye doğru taklit edilemez) "mükemmel" ileri uyumluluğunu alamayacağınızı kabul ettiğiniz sürece (muhtemelen makroları, alternatif ad alanlarını kullanmanız gerekecektir) bazı şeyler) o zaman hepiniz hazırsınız.
C ++ 03'te pratik kullanım için yeterli bir seviyede emüle edilebilen iyi bir çok özellik var - ve örneğin ile gelen tüm güçlükler olmadan: Boost. Heck, hatta C ++ standart önerisi için nullptr
bir C ++ 03 backport önerir. Ve sonra örneğin C ++ 11 everything her şey için TR1 var ama ‑ ‑ yıl stuff için ‑ önizleme yaptık ‑. Sadece, bazı o C ++ 14 assert gibi özellikler şeffaf fanktorlar varyantları ve optional
edebilirsiniz C ++ 03 uygulanacak!
Kesinlikle desteklenemediğini bildiğim sadece iki şey, constexpr ve varyasyon şablonları.
Ad alanına bir şeyler ekleme konusuyla ilgili olarak std
, benim görüşüm bunun hiç önemli olmadığıdır . En önemli ve ilgili C ++ kütüphanelerinden biri olan Boost'u ve bunların TR1: Boost.Tr1'i uygulamasını düşünün. C ++ 'ı geliştirmek istiyorsanız, C ++ 11 ile uyumlu hale getirin, o zaman tanımı gereği C ++ 03 olmayan bir şeye dönüştürüyorsunuz , bu yüzden kendinizi önlemek veya geride bırakmak istediğiniz bir Standart üzerinde kendinizi bloke etmek , basitçe söylemek gerekirse, verimsiz. Puristler şikayet edecek, ancak tanım gereği, onları önemsememelidir.
Tabii ki, sadece (03) Standardını takip etmeyeceğiniz için, denemeyeceğiniz anlamına gelmez ya da onu kırmak için neşeyle dolaşırsınız . Konu o değil. Ad alanına neyin eklendiğini çok dikkatli std
bir şekilde kontrol ettiğiniz ve yazılımınızın kullanıldığı ortamların kontrolüne sahip olduğunuz sürece (yani: test yapın!), Hiçbir şekilde kontrol edilemeyen bir zarar olmamalıdır. Mümkünse, her şeyi ayrı bir ad alanında tanımlayın ve yalnızca "kesinlikle" girilmesi gereken şeylerin ötesinde hiçbir şey eklememeniz using
için ad alanına yalnızca yönergeler ekleyin std
.
Güncelleme (2013) : orijinal sorunun talebi ve tekrarlama eksikliğinden dolayı ekleyemediğim yorumların bazılarını görmek için, C ++ 11 ve C ++ 14 özelliklerinin bir listesi ve taşınabilirlik derecesi C ++ 03'e kadar:
nullptr
: resmi Komite'nin backport'u göz önüne alındığında tamamen uygulanabilir; muhtemelen bir "yerel" tür olarak tanınması için bazı type_traits uzmanlıkları sağlamanız gerekir.
forward_list
: Ayırıcı desteği Tr1 uygulamanızın neler sağlayabileceğine bağlı olsa da, tamamen uygulanabilir.
- Yeni algoritmalar (partition_copy, vb.): Tamamen uygulanabilir.
- Brace sekanslarından (örn .:) konteyner konstrüksiyonları
vector<int> v = {1, 2, 3, 4};
: istenenden daha kötü olsa da, tamamen uygulanabilir.
static_assert
: bir makro olarak uygulandığında neredeyse tamamen uygulanabilir (yalnızca virgülle dikkatli olmanız gerekir).
unique_ptr
: neredeyse tamamen uygulanabilir, ancak arama kodundan da destek almanız gerekir (bunları kaplarda saklamak için vb.); aşağıya bakın.
- rvalue referansları: onlardan ne kadar bekleyeceğinize bağlı olarak neredeyse tamamen uygulanabilir (örn .: Boost Move).
- Her bir yineleme: neredeyse tamamen uygulanabilir, sözdizimi biraz farklı olacaktır.
- yerel işlevleri bağımsız değişken olarak kullanma (örneğin: transform): neredeyse tam olarak uygulanabilir, ancak sözdizimi yeterince farklılık gösterir - örneğin, yerel işlevler çağrı sitesinde tanımlanmaz, hemen önce tanımlanır.
- açık dönüşüm işleçleri: pratik düzeylere uygulanabilir (dönüştürmenin açık hale getirilmesi), bkz. Imperfect C ++ 'ın "explicit_cast"; ancak dil özellikleriyle entegrasyon
static_cast<>
neredeyse imkansız olabilir.
- argüman iletme: yukarıdaki rvalue referanslarında verilen pratik seviyelere uygulanabilir, ancak iletilebilir argümanlar alarak işlevlerinize N aşırı yük sağlamanız gerekir.
- hareket: pratik seviyelere uygulanabilir (bkz. yukarıda). Elbette, bundan yararlanmak için değiştirici kapları ve nesneleri kullanmanız gerekir.
- Kapsamlı paylaştırıcılar: Tr1 uygulamanız buna yardımcı olmadıkça gerçekten uygulanamaz.
- çok baytlı karakter türleri: Tr1'iniz sizi destekleyemediği sürece gerçek anlamda uygulanamaz. Ancak amaçlanan amaç için, C ++ 11 kullanıyor olsa bile , ICU gibi konuyla ilgilenmek için özel olarak tasarlanmış bir kütüphaneye güvenmek daha iyidir .
- Değişken argüman listeleri: bazı güçlüklerle uygulanabilir, argüman iletmeye dikkat edin.
noexcept
: derleyicinizin özelliklerine bağlıdır.
- Yeni
auto
semantik ve decltype
: derleyicinizin özelliklerine bağlıdır - örn .: __typeof__
.
- boyutlu tamsayı türleri (
int16_t
vb.): derleyicinizin özelliklerine bağlıdır - veya Portable stdint.h dosyasına delege edebilirsiniz.
- type öznitelikleri: derleyicinizin özelliklerine bağlıdır.
- Başlatıcı listesi: Bildiğim kadarıyla uygulanamaz; ancak kapsayıcıları sıralı olarak başlatmak istiyorsanız, "kapsayıcı konstrüksiyonlar" ile ilgili yukarıdakilere bakınız.
- Şablon Takma Adı: Bildiğim kadarıyla uygulanamaz, ancak yine de gereksiz bir özellik ve
::type
şablonlarda sonsuza kadar yaşadık
- Değişken şablonları: Bildiğim kadarıyla uygulanamaz; kapanış, N uzmanlığı vb. gerektiren şablon bağımsız değişkenidir.
constexpr
: Bildiğim kadarıyla uygulanamaz.
- Düzgün başlatma: Bilgilerime uygulanamaz, ancak garantili varsayılan yapıcı başlatma, ala Boost'un değer başlangıç değeriyle uygulanabilir.
- C ++ 14
dynarray
: tamamen uygulanabilir.
- C ++ 14
optional<>
: C ++ 03 derleyiciniz hizalama kurulumlarını desteklediği sürece neredeyse tamamen uygulanabilir.
- C ++ 14 şeffaf functors: neredeyse tamamen uygulanabilir, ancak istemci kodunuzun çalışması için büyük olasılıkla örneğin: kullanması gerekecektir
std::less<void>
.
- C ++ 14 yeni assert (örneğin varyantları
assure
:) tamamen yerine atar sen etkinleştirmek istiyorsanız hemen tam olarak uygulanabilir, iddia istiyorsanız uygulanabilir.
- C ++ 14 tuple uzantıları (tuple elemanını türe göre al): tamamen uygulanabilir ve hatta özellik teklifinde açıklanan tam durumlarla derlenemediğini bile alabilirsiniz.
(Feragatname: Bu özelliklerin birçoğu yukarıda bağladığım C ++ backports kütüphanesinde uygulandığından, "tamamen" veya "neredeyse tamamen" dediğimde neden bahsettiğimi biliyorum.)