2010-03-20 64 views
6

Neler olduğunu adım adım kontrol etmenin bir yolu var diyelim ki şablon? Yani adım adım nasıl örnekleniyor? Ben here söz ettik kitaptaHata ayıklama metaprogramları

,

I (2 dakika önce) bir üst-işlevin olarak nasıl yansıdığını da ikili arasında oldukça ilginç bir örnek buldum.

template <unsigned long N> 
    struct binary 
    { 
     static unsigned const value 
      = binary<N/10>::value << 1 // prepend higher bits 
      | N%10;     // to lowest bit 
    }; 

    template <>       // specialization 
    struct binary<0>      // terminates recursion 
    { 
     static unsigned const value = 0; 
    }; 

ve bunu bu şablonun işlem yaptığı sırada yapılmış ne adım adım görmek mümkün oldukça yararlı olabileceğini düşünüyorum. Yanıtlarınız için teşekkürler.

+0

Hızlı bir şekilde bunu kabul etme, belki başka birinin daha iyi bir ipucu var :) –

cevap

0

Bugüne kadar gördüğüm en iyi şey, Templight'daki araştırma makalesiydi, ancak herhangi bir yayınlanmış uygulamanın farkında değildim. Tanımlayıcı statik (yani derleme zamanı) ifadelerini kullanarak kendinize çok yardımcı olabilirsiniz - örn. static assert veya MPLs asserts'u artırır. Bazı durumlarda, derleyiciden bir şablon örnekleme izlemesi almak için bir derleme hatasını (örneğin, statik yönergeleri kullanarak) kışkırtmaya yardımcı olabilir.
Ayrıca, sınama için meta işlev sonuçlarının çalışma zamanı çıktısından sizi engelleyen hiçbir şey yoktur.

+0

Evet, sanırım çalışma zamanı çıkışı beni rahatlatacak. Teşekkürler –

+0

Şimdi çıktı ile bir sorunla karşılaştığımı söylemiştim. Böyle bir şey denedim: cout << N; ama hata alıyorum. Yardım et. –

+1

Yalnızca çıktı ifadelerini meta işlevlerde atamazsınız, ancak meta işlevlerinin somut örneklemelerinden çıkış değerleri alabilirsiniz, örn. std :: cout << binary<101> :: değer '. –