2014-10-14 21 views
11

Şablonlar kendi başlarına program olabilir.Şablon hata ayıklayıcısı var mı?

Şablon hata ayıklayıcısı var mı, böylece şablonun "yürütme" adımını atabilirsiniz?

Bu temelde derleme/link/codegen sırasında yapılan bir şey olması gerekir - ve oluşturulan programda hata ayıklama ayrıdır.

Hatta bir hata ayıklayıcı kullanamazsınız pek çok "ilkel" ortamlarda, genellikle "printf hata ayıklama" yapabilirsiniz. Şablonlarla bile mümkün mü?

düzenleme: Bunun hakkında düşünmenin başka bir yolu, C önişlemcisi gibi bir şeydir. "Önişlemiş" kaynak kodu oluşturmak için genellikle çok kullanışlıdır - önişlemciden derleyicinin gerçekten derlediği çıktı - bu, makrolarınızın ne kadar etkilendiğini görmenizi sağlar. Bir şablon eşdeğeri harika olurdu - derleyici, şablonlu kaynak kodla, templated girdiye eşgüdümlü çıktılar. Alabildiğine en yakın, C++ ila C çeviricisidir. (Comeau derleyici bunu yapmaz?)

+0

Bazı araçlar var ama denemedim, bu yüzden ne yaptıklarını veya ne kadar iyi yaptığını gerçekten bilmiyorum. [TempLight] 'a (https://github.com/sabel83/templight) ya da [metashell]' e bakabilirsiniz (https://github.com/sabel83/metashell) –

+0

"Adım adım" sorusuna cevap veremiyorum şablon derleme, ancak "printf tarzı hata ayıklama" kadar, özel yorum veya yapım çıktısına uyarı yazdırmak için önişlemci yönergeleri kullanabilirsiniz. http://stackoverflow.com/questions/3826832/is-there-a-portable-way-to-print-a-message-from-the-c-preprocessor – iwolf

+0

Gerçekten ilgili değil: * Sonra * tür çıkarıldı , (mangled) adını almak için 'typeid' kullanabilirsiniz. – edmz

cevap

4

Şablon instantiations verir this patch for clang bakmak isteyebilirsiniz.

başka basit araç derleyici tanımlanmamış bir şablon örneğini teşebbüsten üreten hata mesajlarıdır.

template<typename> struct TD; 

template< typename T > 
void your_template_function(T & param) 
{ 
    // Both of these produce an error about "undefined type TD<T> with T = ..." 
    TD<T> test1; 
    TD< decltype(param) > test2; 
} 

Bu doğru halka kuyruklu maki slayt sonra Scott Meyers CPPCon talk açıklanmıştır.

2

Son yıllarda C++ konferansında bu konuyla ilgili bir konuşma vardı. Burada bulabilirsiniz bilgiler bazıları:

http://gsd.web.elte.hu/contents/articles/gpce06.pdf

ve

http://patakino.web.elte.hu/ECOOP_Templight_Poster.pdf

hiçbir fikrim yok nasıl işlevsel bu şeyler şimdi ediliyorsa ama çok ilginç startPoint oldu.

Ben kişisel bana standart kodu için Printf ayıklama gibi bana verilen türlerini yazdırmak mümkün olan bazı yardımcı sınıflar yazdı. Derleme başarısız olursa, DebugPrinter çağrılırken genellikle iyi bir hata iletisi verir ve program derler, ancak sonuç gerçekten çok aptaldır, çünkü DebugPrinter'ın bana çok yardımcı olacağını umduğum tip genişletme değildir!

template< typename T> 
int DebugPrintArgs(T arg) 
{ 
    std::cout << arg << ", "; 
    return 0; 
} 

template <typename Head, typename ... T> 
class DebugPrinter: public DebugPrinter<T...> 
{ 
    public: 
     DebugPrinter() 
     { 
      std::cout << "--------------------------" << std::endl; 
      std::cout << __PRETTY_FUNCTION__ << std::endl; 
      std::cout << "--------------------------" << std::endl; 
     } 

     template< typename ...Y> 
      DebugPrinter(Y ... rest) 
      { 
       std::cout << "Construction of: " << __PRETTY_FUNCTION__ << " Values: " ; 
       ExpandWithConstructor{DebugPrintArgs(rest)...}; 
       std::cout << std::endl; 
      } 

}; 


template <typename Head> 
class DebugPrinter<Head> 
{ 
    public: 
     DebugPrinter() 
     { 
      std::cout << "--------------------------" << std::endl; 
      std::cout << __PRETTY_FUNCTION__ << std::endl; 
      std::cout << "--------------------------" << std::endl; 
     } 
}; 
İlgili konular