वैराडिक टेम्पलेट्स के बहुत सारे फायदे हैं, लेकिन क्या ऐसे अवसर हैं जब सी-स्टाइल वेरिएडिक फ़ंक्शन (<cstdarg>
का उपयोग करके) का उपयोग किया जाना चाहिए?क्या कोई ऐसा मामला है जहां वैरिएबल फ़ंक्शंस को वैरिएडिक टेम्पलेट्स पर प्राथमिकता दी जानी चाहिए?
उत्तर
यदि आप सी ++ कार्यान्वयन के साथ सी एपीआई प्रदान करते हैं, तो टेम्पलेट एपीआई के लिए एक विकल्प नहीं हैं। Varargs हैं।
यदि आपको एक ऐसे कंपाइलर का समर्थन करने की आवश्यकता है जो सी ++ 11 या नए मानक का समर्थन नहीं करता है, तो वैरैडिक टेम्पलेट उपलब्ध नहीं हैं। Varargs हैं।
यदि आपको फ़ायरवॉल संकलन की आवश्यकता है। अर्थात। आपको हेडर से फ़ंक्शन के कार्यान्वयन को छिपाने की आवश्यकता है, फिर विविध टेम्पलेट एक विकल्प नहीं है। Varargs हैं।
मेमोरी बाधित सिस्टम (एम्बेडेड) पर, टेम्पलेट द्वारा उत्पन्न विभिन्न फ़ंक्शन बहुत अधिक ब्लोट पेश कर सकते हैं। उस ने कहा, इस तरह के सिस्टम आम तौर पर वास्तविक समय भी होते हैं, इस मामले में शाखाओं और ढेर के उपयोग के कारण वर्गार्ज भी अस्वीकार्य हो सकता है।
मैं अधिभार संकल्प पर अंतिम विचार किया जा रहा की उनकी संपत्ति की वजह से भी कुछ metaprogramming (लक्षण उदाहरण के लिए SFINAE के साथ लागू) में किया जाता है excellent answer of @user2079303
varargs में जोड़ना चाहते हैं।
मान लीजिए कि हम पता लगाने के लिए एक विशेषता को लागू करना चाहते हैं तो एक वर्ग कुछ प्रकार से constructible में है (कुछ std::is_constructible की तरह:
एक सरलीकृत आधुनिक कार्यान्वयन (यह एक ही रास्ता नहीं है इस तरह जाना होगा: के रूप में कहा, void_t
भी be used to implement the trait और जल्द ही (? 2020) हम इन चालबाज़ियों से किसी की जरूरत नहीं होगी कर सकते हैं के रूप में concepts एक प्रथम श्रेणी नागरिक के रूप में require
खंड) के साथ अपने रास्ते पर हैं:
template <class T, class... Args> struct Is_constructible {
template <class... Params>
static auto test(Params... params) -> decltype(T{params...}, std::true_type{});
static auto test(...) -> std::false_type;
static constexpr bool value = decltype(test(std::declval<Args>()...))::value;
};
यह SFINAE की वजह से काम करता है: जब तत्काल एनजी test
, अगर कुछ dependent name के कारण अर्थशास्त्र अमान्य हैं, तो यह एक कठिन त्रुटि नहीं है, इसके बजाय ओवरलोड को अनदेखा किया जाता है।
यदि आप लक्षणों की चाल के बारे में अधिक जानना चाहते हैं और वे कैसे कार्यान्वित होते हैं और वे कैसे काम करते हैं, तो आप आगे पढ़ सकते हैं: sfinae idiom, member detector idiom, enable_if idiom।
तो, एक प्रकार X
केवल 2 ints से निर्माण किया जा सकता है के साथ:
struct X { X(int, int) {}; };
हम ये परिणाम प्राप्त:
Is_constructible<X, int, int>::value // true
Is_constructible<X, int>::value; // false
सवाल अब है कि क्या हम साथ varargs परीक्षण की जगह ले सकता वैरैडिक टेम्पलेट्स:
template <class T, class... Args> struct Is_constructible_broken {
template <class... Params>
static auto test(Params... params) -> decltype(T{params...}, std::true_type{});
template <class... Params>
static auto test(Params...) -> std::false_type;
static constexpr bool value = decltype(test(std::declval<Args>()...))::value;
};
और उत्तर नहीं है (कम से कम नहीं टी प्रत्यक्ष प्रतिस्थापन)।जब हम
Is_constructible_broken<X, int, int>::value
का दृष्टांत हम कोई त्रुटि मिलती है:
error: call of overloaded '
test(int, int)
' is ambiguous
क्योंकि दोनों भार के व्यवहार्य हैं और दोनों एक ही "रैंक" अधिभार संकल्प में है। Varargs के साथ पहला कार्यान्वयन काम करता है क्योंकि भले ही दोनों अधिभार व्यवहार्य हैं, वैरिएड टेम्पलेट को vararg एक पर प्राथमिकता दी जाती है।
ऐसा लगता है कि आप वास्तव में यह variadic टेम्पलेट्स के साथ काम कर सकते हैं। चाल पहले अधिभार के लिए एक आदर्श मैच और दूसरे के लिए कोई रूपांतरण होता है कि test
एक कृत्रिम पैरामीटर जोड़ने के लिए है:
struct overload_low_priority{};
struct overload_high_priority : overload_low_priority {};
template <class T, class... Args> struct Is_constructible2 {
template <class... Params>
static auto test(overload_high_priority, Params... params)
-> decltype(T{params...}, std::true_type{});
template <class... Params>
static auto test(overload_low_priority, Params...) -> std::false_type;
static constexpr bool value
= decltype(test(overload_high_priority{}, std::declval<Args>()...))::value;
};
लेकिन मुझे लगता है varargs इस मामले में और अधिक स्पष्ट है।
ध्यान दें कि 'void_t' का उपयोग इलिप्सिस के उपयोग के बजाय गुण बनाने के लिए किया जा सकता है। – Jarod42
@ Jarod42 हाँ, और जल्द ही है कि [आवश्यकता खंड] द्वारा भी अप्रचलित हो जाएगा (http://en.cppreference.com/w/cpp/language/constraints) – bolov
मैं पसंद 'struct high_overload_priority: low_overload_priority {};' उपयोग ओवरलोड को ऑर्डर करने के लिए 'int' /' long' पर। – Jarod42
vararg __attribute__ format
का उपयोग कर सकते हैं। जैसे
void debug(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
void f(float value)
{
debug("value = %d\n", value); // <- will show warning.
}
दुर्भाग्य से यह विविध टेम्पलेट का उपयोग करके हासिल नहीं किया जा सकता है।
संपादित: जैसा कि व्लादिमीर ने बताया, मैं उल्लेख करना भूल गया कि __attribute__ format
मानक का हिस्सा नहीं है, हालांकि यह जीसीसी और क्लैंग (लेकिन विजुअल स्टूडियो नहीं) दोनों द्वारा समर्थित है। अधिक जानकारी के लिए कृपया देखें: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes
मैं आपको __attribute__ प्रारूप के उपयोग को जोड़ने का सुझाव दूंगा क्योंकि यह मानक में नहीं है। मुझे यह भी लगता है कि इसका उपयोग करने वाले कुछ कंपाइलरों को दिखाना अच्छा होता है। मुझे केवल जीसीसी पता है। –
https://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html –
- 1. जब एक स्थिर क्षेत्र पर स्पॉक की @ शेर एनोटेशन को प्राथमिकता दी जानी चाहिए?
- 2. ब्रांचिंग और इसके विपरीत (सीवीएस में) पर टैग को प्राथमिकता कब दी जानी चाहिए?
- 3. जार 305 में एनोटेशन होना चाहिए। Findbugs के लिए annotation.jar में समान एनोटेशन पर प्राथमिकता दी जानी चाहिए?
- 4. आलसी 0-को गेटटर में आलसी शुरुआत के लिए प्राथमिकता दी जानी चाहिए?
- 5. क्या PHP 'नोटिस' की सूचना दी जानी चाहिए?
- 6. वैरिएडिक टेम्पलेट्स में लैम्ब्डा
- 7. क्या मुझे सी ++ में स्थिर सरणी हटा दी जानी चाहिए?
- 8. वैरिएडिक टेम्पलेट्स की स्केलेबिलिटी
- 9. क्या कोई ऐसा मामला है जहां 'बचाव वस्तु' के माध्यम से रूबी "अपवाद" प्राप्त होगा?
- 10. नौ-पैच ड्राइटेबल बनाम आकार ड्रायबल। किसको प्राथमिकता दी जानी चाहिए?
- 11. स्विच स्टेटमेंट Fallthrough ... इसे अनुमति दी जानी चाहिए?
- 12. जहां कॉल स्टैक में भूमिका जांच की जानी चाहिए?
- 13. जब निरस्त() को निकास() पर प्राथमिकता दी जाती है?
- 14. वैरिएडिक टेम्पलेट्स में घोषणाकर्ता संशोधक स्थिति
- 15. SQL सर्वर 2005 में संग्रहीत प्रक्रिया पर नियंत्रण अनुमति दी जानी चाहिए?
- 16. सी ++ 0x वर्ग फैक्ट्री वैरिएडिक टेम्पलेट्स समस्या
- 17. जावा में सी ++ वैरिएडिक टेम्पलेट्स के समतुल्य
- 18. बूस्ट है। सी ++ 0x वैरिएडिक टेम्पलेट्स के साथ संगत?
- 19. क्या रेफरेंसियल अखंडता लागू की जानी चाहिए?
- 20. जावास्क्रिप्ट ऑनलोड और स्क्रिप्ट कॉलबैक फ़ंक्शंस, जो प्राथमिकता लेता है?
- 21. क्या मुझे इसे विलय करने के बाद शाखा हटा दी जानी चाहिए?
- 22. फंक्शन (प्रतीकात्मक विधि को प्राथमिकता दी)
- 23. क्या रक्षात्मक प्रतियां हमेशा की जानी चाहिए?
- 24. क्या ऐसा कोई मामला है जब आखिरकार कोशिश करें अंततः ब्लॉक नहीं किया जाएगा?
- 25. क्या एसक्यूएल में कोई मामला है जहां एक सबक्वायरी शामिल होने से अधिक कुशल है?
- 26. विशेष फ़ंक्शन टेम्पलेट्स पर अधिभारित फ़ंक्शंस को कनवर्ट करें
- 27. स्विफ्टलिंट चेतावनी: जहां उल्लंघन के लिए: 'कहां' के लिए ```` में 'जहां' खंडों को प्राथमिकता दी जाती है। (for_where)
- 28. क्या होगा यदि call_user_func को झूठी वापसी की जानी चाहिए?
- 29. नामित? टेम्पलेट्स में पैरामीटर, फ़ंक्शंस
- 30. क्या ऐसा कोई सीएसएस ढांचा है?
varargs भी अधिभार संकल्प पर अंतिम विचार किया जा रहा की उनकी संपत्ति की वजह से कुछ metaprogramming (लक्षण उदाहरण के लिए SFINAE के साथ लागू) में किया जाता है। – bolov
@ बोल्व शांत! मैंने उस मामले का कभी सामना नहीं किया है। ध्वनि थोड़ा * मेरे अच्छे हालांकि :) – user2079303
@bolov के लिए भी * चालाक आप अधिक विवरण, यहां तक कि कोड उदाहरण या लिंक –