2014-10-14 8 views
11

टेम्पलेट्स स्वयं प्रोग्राम हो सकते हैं।क्या कोई टेम्पलेट डीबगर है?

क्या कोई टेम्पलेट डीबगर है ताकि आप टेम्पलेट के "निष्पादन" के माध्यम से कदम उठा सकें?

यह मूल रूप से कुछ ऐसा होना चाहिए जो संकलन/लिंक/कोडेजन के दौरान किया जाता है - और जेनरेट किए गए प्रोग्राम को डीबग करने से अलग है।

यहां तक ​​कि कई "आदिम" वातावरण में जहां आप डीबगर का उपयोग नहीं कर सकते हैं, आप आमतौर पर "printf डिबगिंग" कर सकते हैं। टेम्पलेट्स के साथ भी यह संभव है?

संपादित करें: इस बारे में सोचने का एक और तरीका सी प्रीप्रोसेसर की तरह कुछ है। यह "प्रीप्रोसेस्ड" स्रोत कोड उत्पन्न करने के लिए अक्सर बहुत उपयोगी होता है - प्रीप्रोसेसर से आउटपुट जो संकलक वास्तव में संकलित कर रहा है - यह आपको यह देखने देता है कि आपके मैक्रोज़ का क्या प्रभाव है। एक टेम्पलेट समकक्ष बहुत अच्छा होगा - संकलक आउटपुट गैर-टेम्पलेट स्रोत कोड है जो टेम्पलेट इनपुट के लिए कोरसपॉन्ड करता है। मुझे लगता है कि निकटतम आप सी ++ से सी अनुवादक है। (क्या आउराऊ कंपाइलर ऐसा नहीं करता है?)

+0

कुछ उपकरण हैं लेकिन मैंने कोशिश नहीं की है इसलिए मुझे नहीं पता कि वे वास्तव में क्या करते हैं या वे इसे कितनी अच्छी तरह से करते हैं। आप [TempLight] (https://github.com/sabel83/templight) या [मेटाशेल] (https://github.com/sabel83/metashell) देख सकते हैं –

+0

मैं "चरणबद्ध" के प्रश्न का उत्तर नहीं दे सकता टेम्पलेट संकलन, लेकिन जहां तक ​​"printf-style डिबगिंग" है, आप बिल्ड आउटपुट पर कस्टम टिप्पणियां या चेतावनियां मुद्रित करने के लिए प्रीप्रोसेसर निर्देशों का उपयोग कर सकते हैं। http://stackoverflow.com/questions/3826832/is-there-a-portable-way-to-print-a-message-from-the-c-preprocessor – iwolf

+0

वास्तव में संबंधित नहीं है: * के बाद * प्रकार को घटाया गया है , आप इसके (उलझन) नाम प्राप्त करने के लिए 'टाइपिड' का उपयोग कर सकते हैं। – edmz

उत्तर

4

आप this patch for clang पर देख सकते हैं जो टेम्पलेट इंस्टॉलेशन को आउटपुट करता है।

एक और सरल टूल त्रुटि संदेश है जो आपके कंपाइलर एक अपरिभाषित टेम्पलेट को तुरंत चालू करने के प्रयास के लिए उत्पन्न करता है।

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; 
} 

यह सही अंगूठी पूंछ बंदर स्लाइड के बाद, Scott Meyers CPPCon talk से समझाया गया है।

2

पिछले वर्षों में सी ++ सम्मेलन उस विषय पर एक बात थी। जानकारियां आप यहां पा सकते हैं में से कुछ:

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

और

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

मुझे पता नहीं है कैसे कार्यात्मक सामान अब है, लेकिन यह एक बहुत ही दिलचस्प startpoint था।

मैंने व्यक्तिगत रूप से मुझे कुछ सहायक कक्षाएं लिखीं जो मुझे मानक कोड के लिए प्रिंटफ डिबगिंग जैसे दिए गए प्रकार प्रिंट करने में सक्षम हैं। यदि संकलन विफल रहता है तो यह अक्सर डीबग प्रिंटर को कॉल करते समय एक अच्छा त्रुटि संदेश देता है और यदि प्रोग्राम संकलित करता है लेकिन परिणाम वास्तव में बेवकूफ है क्योंकि प्रकार का विस्तार वह नहीं है जो मुझे उम्मीद है कि डीबग प्रिंटर मुझे बहुत मदद करता है!

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; 
     } 
}; 
संबंधित मुद्दे