SORU
4 EYLÜL 2011, Pazar


C Metaprogramming ve D

C şablon mekanizması sadece yanlışlıkla template metaprogramming için yararlı oldu. Öte yandan, D özellikle bunu kolaylaştırmak için tasarlanmıştır. Ve görünüşe göre anlaması daha kolay (duydum).

D ve template metaprogramming gelince C, yapamazsınız, D ile hiç deneyimim yok , ama merak ediyorum, ne oldu?

CEVAP
5 EYLÜL 2011, PAZARTESİ


D template metaprogramming yardımcı olacak iki büyük işler şablon kısıtlamaları ve C teorik olarak ekleyebilirsiniz ikimiz de büyük fayda olan static if -.

Şablon kısıtlamaları şablon örneği olabilmesi için doğru olması gereken bir şablon üzerinde bir koşul koymak için izin verir. Örneğin, bu std.algorithm.find'nin aşırı: . bir imza

R find(alias pred = "a == b", R, E)(R haystack, E needle)
    if (isInputRange!R &&
        is(typeof(binaryFun!pred(haystack.front, needle)) : bool))

Sipariş için bu şablon işlevi yapabilmek için örneği yazın R da giriş aralığı ile tanımlanır std.range.isInputRange (isInputRange!R olmalı true), verilen yüklem gerekiyor bir ikili işlevi derler ile verilen argümanlar ve döndürür bir türü, örtülü olarak dönüştürülebilir bool. Eğer şablon kısıtlaması durumun sonucu ise false, sonra şablonu derleme olmaz. Sadece bunu korumak senin pis şablon hataları aldın C, D, E şablonlar olmaz derleme ile verilen argümanlar, ama yapar bu yüzden, aşırı şablonları özelliklerine göre şablon kısıtlamaları. Örneğin, hangi find başka bir aşırı yüklenme var

R1 find(alias pred = "a == b", R1, R2)(R1 haystack, R2 needle)
if (isForwardRange!R1 && isForwardRange!R2
        && is(typeof(binaryFun!pred(haystack.front, needle.front)) : bool)
        && !isRandomAccessRange!R1)

Aynı argüman alır, ama kısıtlama farklıdır. Bu yüzden, farklı türleri aynı şablon işlevi farklı aşırı çalışmak, find en iyi uygulama, her bir türü için kullanılabilir. Bu tür şeyler C temiz bir şekilde yapmanın bir yolu yok . Biraz bilgisi olan işlevleri ve şablonları kullanılan tipik bir şablon kısıtlaması, şablon kısıtlamaları D oldukça kolay okuma, oysa gereken bazı çok karmaşık template metaprogramming C için bile kalkışmak gibi bir şey bu, sıradan bir programcı değil mümkün olacak anlamak şöyle dursun, aslında kendi. Boost bu bir örnektir. Bazı inanılmaz şeyler yapar, ama çok karmaşık.

static if hatta mevcut durumu daha da artırır. Şablon kısıtlamaları gibi, derleme zamanında değerlendirilebilecek herhangi bir durum ile kullanılabilir. örneğin

static if(isIntegral!T)
{
    //...
}
else static if(isFloatingPoint!T)
{
    //...
}
else static if(isSomeString!T)
{
    //...
}
else static if(isDynamicArray!T)
{
    //...
}
else
{
    //...
}

Derlenen ilk true değerlendiren bağlıdır. Yani, bir şablon içinde şablon örneği - veya derleme zamanında değerlendirilebilir başka bir şey dayanıyordu türlerine göre uygulanması parçaları uzmanlaşmak olabilir. Örnek kullanımlar için

static if(is(typeof(clock_gettime)))

kodu derlemek için sistem clock_gettime (clock_gettime varsa onu kullanır, yoksa gettimeofday kullanır) sağlayıp farklı dayalı.

Muhtemelen D şablonları geliştirir nerede gördüğüm en sade örnek çalışma ekibim C koştu hangi bir sorun ile . Şablon farklı verildi türünü belirli bir temel sınıf türetilmiş olup olmadığını dayalı oluşturmak için gerekli. Bir çözüm this stack overflow question temel kullanıyoruz sona erdi. Çalışır, ama bir tür başka bir türetilmiş olup sadece test için oldukça karmaşık.

D ancak, tüm yapmanız gereken : operatörünü kullanın. örneğin

auto func(T : U)(T val) {...}

Eğer T örtük olarak dönüştürülebilir için U (gibi olur T türemiş U), func derlenir, eğer oysa T değil örtük olarak dönüştürülebilir için U, o zaman olmaz.Bubasit bir gelişme bile temel şablon uzmanlık çok daha güçlü (hatta şablon kısıtlamaları veya static if olmadan) yapar.

Şahsen ben nadiren kullanmak için bir ağrı çok çünkü onlar C kaplar dışında ve <algorithm>, ara sıra işlev şablonları kullanın. Çirkin hataları neden ve çok zor bir şey fantezi. Bir şey biraz karışık hatta biraz yapmak için şablonlar ve şablon metaprogramming çok yetenekli olmak gerekir. D şablonları ile olsa da, her zaman onları kullanmak çok kolay. Hatalarının çok daha kolay kavrar ve anlaşma ile (gerçi onlar hala daha kötü hatalar genellikle ile oluşturulmamış fonksiyonlar), ve ben yok anlamak için ne kadar kuvvet diline ne istiyorum ile süslü metaprogramming.

Sebep yok C olamaz kazanmak çok bu yetenekleri, D (C kavram olur yardım ederlerse hiç o dizildi), ama onlar kadar ekleyin temel koşullu derleme ile benzer yapıları için şablon kısıtlamaları ve static if C , C şablonlar yok karşılaştırır D şablonları açısından kullanım kolaylığı ve güç.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CruzerLite

    CruzerLite

    1 EKİM 2011
  • DavidParody

    DavidParody

    17 EKİM 2009
  • tychoadragmire

    tychoadragmi

    20 Mart 2006