2015-05-27 7 views
7

मैं प्रत्येक विशिष्ट इकाई में तत्काल होने से रोकने के लिए एक विशिष्ट टेम्पलेटेड कक्षा के लिए सभी अंतर्निहित टेम्पलेट इंस्टॉलेशन को रोकना चाहता हूं।मैं एक विशिष्ट टेम्पलेट के लिए निहित टेम्पलेट इंस्टॉलेशन को कैसे रोकूं?

ऐसा लगता है कि मेरी विकल्प हैं: जीसीसी के कमांड लाइन पर

  1. उपयोग -fno-निहित-टेम्पलेट्स। यह सभी अंतर्निहित टेम्पलेट इंस्टॉलेशन को दबा देता है, और जो मैं चाहता हूं वह नहीं है। मैं केवल इसे एक ही टेम्पलेट के लिए रोकना चाहता हूं।
  2. सी ++ 11 "बाहरी टेम्पलेट" का उपयोग करें। लेकिन यह केवल विशिष्ट स्पष्ट तत्कालताओं को दबाता है। मैं प्रत्येक संभावित टेम्पलेट पैरामीटर सूची के लिए "बाहरी टेम्पलेट" लाइन टाइप करना नहीं चाहता हूं, यह टेम्पलेट तत्काल हो सकता है।

तो मुझे बीच में कुछ चाहिए। यह अच्छा होगा:

extern template class Foo; // suppress all implicit instantiations of Foo 

(टेम्पलेट पैरामीटर की कमी पर ध्यान दें।) कोई विचार?

+0

उपयोग का मामला क्या है? क्या आप कुछ तत्कालताओं का उपयोग करने से रोकने की कोशिश कर रहे हैं, या बस कुछ ऑब्जेक्ट फ़ाइल स्थान को सहेजने और समय जोड़ने की कोशिश कर रहे हैं? – user657267

+0

मैं संकलन समय बचाने की कोशिश कर रहा हूं। यह इस मामले में एक बड़ा अंतर बनाता है। और यद्यपि मैं अलग-अलग तात्कालिकताओं को खोजने के लिए कभी-कभी अलग-अलग हिस्सों को ढूंढने के लिए अलग-अलग हिस्सों को जोड़ सकता हूं, मैं लिंकर को किसी भी नए नए निहित तत्कालताओं पर बस त्रुटि देता हूं ताकि उन्हें तुरंत स्पष्ट सूची में जोड़ा जा सके। व्यक्ति द्वारा तत्काल संशोधन जो कारक संशोधन कर रहा है। –

+8

आप एक हेडर और स्रोत फ़ाइल के बीच टेम्पलेट परिभाषा को विभाजित कर सकते हैं जैसे कि आप एक गैर-टेम्पलेट करेंगे। फिर, जब तक आप स्रोत फ़ाइल में अनुमत प्रकारों के सेट के लिए टेम्पलेट को तत्काल प्रारंभ नहीं करते हैं, तो लिंकिंग विफल हो जाएगी। – Praetorian

उत्तर

1

मैं कहूँगा कि आपके सवाल का जवाब सी ++ नए प्रकार लक्षण उपयोग कर रहा है अपने निर्माता में instantiations बात पर जोर देना:

static_assert(std::is_same<TInstantiation, [your-predefined-type]> || std::is_same<TInstantiation, [your-predefined-type2]> /*And so on...*/, "Classname can not be instantiated using this type!"); 

यह सब गारंटी है संकलन समय पर हल करने के लिए :)

1

आप कर सकते हैं कक्षा को विभाजित करें जैसे आप एक गैर-टेम्पलेट वर्ग के साथ करेंगे। बस घोषणाओं को एक शीर्षलेख में डालें और उसमें हर जगह शामिल करें, और कार्यान्वयन को .inl/.i फ़ाइल में डालें और इसमें केवल वह जगह शामिल करें जहां आप अपना टेम्पलेट तत्काल होना चाहते हैं। वैकल्पिक रूप से, एक फ़ाइल के साथ ऐसा करने के लिए संकलन समय स्विच का उपयोग करें - लेकिन आपको घोषणा और कार्यान्वयन को अलग करना होगा।

1

आप जो वास्तव में std::is_same के संयोजन के साथ इस करता std::enable_if उपयोग कर सकते हैं:

template <class T , typename = std::enable_if <!std::is_same<T,Foo>::value,T>::type > 
class MyClass{ 
//... 
}; 

अब myClass Foo प्रकार के लिए संकलित नहीं किया जाएगा।

संबंधित मुद्दे