किसी वस्तु का अभिन्न होने या न होने का एक वर्ग प्रकार है या नहीं यह जानने में क्या हर्ज है?


14

नमस्कार, मैंने Cppreference.com में इस तरह के कई उदाहरण देखे हैं:

std::is_class<T>
std::is_integral

और इसी तरह। मुझे पता है कि मैं उदाहरण के लिए कोड चलाता हूं trueया नहीं false। लेकिन इसमें क्या बात है? जैसे वस्तु को जानना वर्ग प्रकार का है या नहीं?

#include <iostream>
#include <type_traits>

struct A {};
class B {};
enum class C {};

int main()
{
    std::cout << std::boolalpha;
    std::cout << std::is_class<A>::value << '\n';
    std::cout << std::is_class<B>::value << '\n';
    std::cout << std::is_class<C>::value << '\n';
    std::cout << std::is_class<int>::value << '\n';
}

उत्पादन:

true
true
false
false
  • मैं इस का उपयोग करते हुए एक वास्तविक उदाहरण के लिए भर में खोज की है ( is_class, is_integral, is_arithmetic, ...) लेकिन सभी ट्यूटोरियल केवल निराशाजनक उदाहरण दिखाने: केवल trueया false

  • किसी को भी इस टेम्पलेट का उपयोग कर एक छोटे से उपयोगी उदाहरण के साथ मेरी मदद कर सकता है?


1
एक साधारण उदाहरण - std::copy। क्या होगा यदि प्रकार std::copy"सरल" हैं, intया की एक सरणी की तरह char? आप उपयोग करेंगे memcpy, है ना? तो आप कैसे कहते हैं "यदि प्रकार सरल है, तो मेमसीपी का उपयोग करें, अन्यथा" धीमी "लूप" का उपयोग करें?
पॉलमैकेन्जी

जवाबों:


17

यह कंसोल के लिए लिखने के लिए नहीं है, यह सुनिश्चित करने के लिए है।

अधिक मोटे तौर पर आप पूछ रहे हैं: प्रकार लक्षण क्या है?

इसका उत्तर है टेम्पलेट मेटाप्रोग्रामिंग । उदाहरण के लिए, मैं एक टेम्पलेट विशेषज्ञता बना सकता हूं जो अभिन्न प्रकारों के लिए एक काम करता है, और दूसरा गैर-अभिन्न प्रकारों के लिए।

हारून बुलमैन के पास टाइप करने के लिए एक सरल परिचय है , जैसा कि यहां जेसेक करता है

मेरी राय में, इन चीजों का अधिकांश उपयोग पृष्ठभूमि सुविधाओं के हिस्से के रूप में शांत सुविधाओं और वर्गों और उपयोगिताओं (यानी पुस्तकालयों में) के कार्यान्वयन के भीतर दफन पाया जाएगा, जो यह सब काम करता है।

आगे की पढाई:

राइटफॉल्ड का उत्तर उस पहले पर जब लक्षण उपयोगी हैं, एक शानदार उदाहरण देता है:

उदाहरण के लिए, एक कार्यान्वयन एक स्पष्ट लूप के बजाय आंतरिक रूप से std::copyउपयोग कर सकता है std::memcpyजब पुनरावृत्तियों PODs को इंगित करते हैं। यह SFINAE के साथ प्राप्त किया जा सकता है।


तो आप उदाहरण के लिए मतलब है कि मैं विशिष्ट प्रकार के लिए टेम्पलेट्स के कुछ उदाहरणों को अक्षम करने के लिए उनका उपयोग कर सकता हूं उदाहरण के लिए टेम्पर्ड-फंक्शन Power<T>या क्लास को अक्षम करना तर्कसंगत है जब तर्क प्रकार अभिन्न नहीं है तो आइए स्टैड :: स्ट्रिंग कहते हैं?
रामी येन

1
@RamiYen, हाँ, इसे SFINAE कहा जाता है ।
क्रिस

7

यह टेम्प्लेट मेटा प्रोग्रामिंग के लिए है। जब आपको पता नहीं होगा कि अंत-उपयोगकर्ता किस प्रकार (ओं) को टेम्पलेट में पारित करेगा। कभी-कभी यह त्रुटियों की रिपोर्ट करने के लिए होता है, कभी-कभी यह पारित किए गए प्रकारों के विशेषज्ञ के लिए होता है। कभी-कभी यह एक संयोजन है।

Cppreference.com (उदाहरण https://en.cppreference.com/w/cpp/types/is_enum ) पर देखे गए उदाहरण बहुत अधिक सरलीकृत हैं और बस दिखाते हैं कि गैर-विशिष्ट तरीके से विशेषता का उपयोग कैसे करें। आप इन लक्षणों को लगभग सीधे एक साधारण (गैर-टेम्पलेट फ़ंक्शन या वर्ग) में उपयोग नहीं करेंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.