2017-03-27 17 views
6
template <typename T, typename R, typename ...A> 
struct decay<T, R(A..., ...)> { using type = R(*)(A..., ...); }; 

का क्या अर्थ है इसका अर्थ क्या है? मुझे कुछ मदद की ज़रूरत है ~'संरचना क्षय <टी, आर (ए ..., ...)> `

+1

आप उस कोड को कहां देखा? ऐसा लगता है कि कोई व्यक्ति 'std :: क्षय' को लागू करने के लिए उचित रूप से उपयोग करेगा, लेकिन 'टी' के लिए कोई कारण नहीं है ... मेरी पहली धारणा यह है कि आपने इसे गलत कॉपी किया है। – Yakk

+0

@Yakk: यह कोड boost :: hana से है। –

+1

आह: http://www.boost.org/doc/libs/1_62_0/libs/hana/doc/html/structboost_1_1hana_1_1detail_1_1decay.html यह एक अनुकूलन है। जो अन्यथा गैरकानूनी डिजाइन बताता है; वे टेम्पलेट तत्काल अक्षमता के आसपास काम कर रहे हैं। – Yakk

उत्तर

7
int foo(int); 
int bar(int, ...); 

ये दो अलग-अलग कार्य हैं। fooint(int) प्रकार का है। barint(int,...) प्रकार का है।

... सी-शैली varargs है, भिन्नता टेम्पलेट तर्कों के साथ भ्रमित नहीं होना चाहिए जो ... का भी उपयोग करता है।

template <typename T, typename R, typename ...A> 
struct decay<T, R(A..., ...)> { using type = R(*)(A..., ...); }; 

boost::hana भीतर std::decay की एक अनुकूलित संस्करण के एक कार्यान्वयन के इस भाग को। typename T और T भागों लाल हेरिंग्स हैं, जो अनुकूलन का हिस्सा हैं।

यह एक विशेषज्ञता है जो R(A..., ...) से मेल खाता है, जहां A... और R फ़ंक्शन हस्ताक्षर से निकाले जाते हैं।

आप इस hana::details::decay को 2 तर्क के रूप में पारित कर दिया double(int, char, ...) हैं, तो Rdouble होगा और A...int, char होगा। और ... "सी-स्टाइल वैरैग से मेल खाता" होगा।

इस विशेष विशेषज्ञता का उद्देश्य फ़ंक्शन हस्ताक्षरों को मैप करना है जो सी-शैली varargs में एक ही हस्ताक्षर के लिए पॉइंटर्स तक समाप्त होता है। तो यह double(int, char, ...) से double(*)(int, char, ...) पर नक्शा करता है।

सी शैली varargs टेम्पलेट विविधता तर्क के समान नहीं हैं। वे इसे भविष्यवाणी करते हैं।

+0

बहुत बहुत धन्यवाद। मैं यही जानना चाहता हूं। –

6

यह विशेषज्ञता उन विशेषज्ञताओं में से एक है जो फ़ंक्शन प्रकार के क्षय को संबंधित पॉइंटर-टू-फ़ंक्शन प्रकार पर लागू करती हैं, जो कि काम के अंतराल को पॉइंटर प्रोजेक्ट को कार्य करने के तरीके को मिरर करती है।

यह विशेष विशेषज्ञता चर-तर्क कार्यों के लिए उपयोग की जाती है (जिनकी पैरामीटर सूची एक इलिप्सिस में समाप्त होती है ताकि यह उन तर्कों को स्वीकार करे जो किसी भी पैरामीटर से मेल नहीं खाते हैं)।

+0

से अलग है, मुझे समझ में नहीं आता कि उस उद्देश्य के लिए दो-तर्क 'क्षय' क्यों होगा। – Yakk

+1

'टेम्पलेट <टाइपनाम आर, टाइपनाम ... ए> स्ट्रक्चर क्षय <आर (ए ..., ...)> {टाइप = आर (*) (ए ..., ...); }; '' क्षय 'का एक विशेषज्ञ है जो एक विशिष्ट प्रकार के फ़ंक्शन हस्ताक्षर को पकड़ता है। मुझे समझ में नहीं आता कि आपके पास क्षय का दो-तर्क संस्करण क्यों होगा, फिर पहले तर्क को अनदेखा करें। – Yakk

+0

@ केरेकस्क: मैं समझ नहीं पा रहा हूं कि आपने क्या कहा है, क्या आप कृपया और बता सकते हैं? –

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