मैं std::vector
के समान कुछ लागू कर रहा हूं लेकिन स्मृति आवंटन के बजाय स्टैक पर सरणी का उपयोग करता हूं।sfinae एक विनाशक
डी-टोर एक फ़ंक्शन को कॉल करता है जो SFINAE का उपयोग करता है।
- यदि
value_type
पीओडी है तो समारोह में खाली शरीर है। - यदि
value_type
सामान्य श्रेणी हैstd::string
, फ़ंक्शन में एक शरीर है और सभी डेटा ठीक से नष्ट कर देता है।
अब, मैं इस नए std::vector
को constexpr
के रूप में उपयोग करने में सक्षम होना चाहता हूं। हालांकि सी-टोर भी constexpr
घोषित किया गया है, कोड संकलित नहीं करता है क्योंकि कक्षा में गैर तुच्छ डी-टोर है।
template<typename T, std::size_t SIZE>
class SmallVector{
constexpr SmallVector() = default;
~SmallVector(){
destructAll_<value_type>();
}
// ...
template<typename X>
typename std::enable_if<std::is_trivially_destructible<X>::value == true>::type
destructAll_() noexcept{
}
};
क्या मैं कक्षा होना constexpr
अगर value_type
पॉड और गैर पॉड डेटा प्रकार के लिए कार्यक्षमता रखने है बनाने के लिए कुछ कर सकते हैं:
यहाँ कोड का छोटा सा हिस्सा है।
(पाठ्यक्रम के एक ही समय में नहीं)
मैं बजाय 'SmallVectorImpl <टी, आकार, is_trivially_destructible :: मूल्य>' जो एक मुख्य परिभाषा और तुच्छता ध्वंसशील प्रकार के लिए एक विशेषज्ञता होगा से विरासत होगा। दोनों के बीच विनाशक के बीच एकमात्र अंतर। –
DeiDei
मेरा विचार समान है - केवल दो मूल संस्करणों में केवल बेस क्लास और सभी उत्परिवर्तन विधियों को पढ़ा जाता है। क्या आप अपने विचार के साथ भी उत्तर दे सकते हैं, क्योंकि मुझे नहीं लगता कि तीसरा टेम्पलेट "घटक" कैसे मदद करता है। क्या आप दो आधार वर्गों से उत्तराधिकारी का मतलब है? – Nick
'std :: vector' के समान कैसे हो सकता है, वास्तव में? क्या आप 'std :: array' को फिर से कार्यान्वित कर रहे हैं? Orrrr यह एक वेक्टर है जिसमें एक विशाल ऑटो-स्टोरेज सरणी है और बहुत सारे प्लेसमेंट नए हैं? :) –