int foo(int){
...
}
उत्तर
ही एक मामला है जहाँ आप एक समारोह को परिभाषित लेकिन पैरामीटर नाम नहीं स्कॉट Meyers के "प्रभावी सी ++, 3 संस्करण" में दी गई है, मद 47:
template<typename IterT, typename DistT>
void advance(IterT& iter, DistT d)
{
doAdvance(iter, d,
typename std::iterator_traits<IterT>::iterator_category());
}
:
template<typename IterT, typename DistT>
void doAdvance(IterT& iter, DistT d,
std::random_access_iterator_tag)
{
iter += d;
}
में प्रयोग किया जाता है
अनिवार्य रूप से, doAdvance में तीसरा पैरामीटर एक चर नाम से unaccompanied है, यानी यह एक अनाम पैरामीटर है। एक अनाम पैरामीटर होने में कोई समस्या नहीं है, क्योंकि उस तर्क का उपयोग केवल उस अधिभार के दौरान किया जाता है जिसके उपयोग के लिए अधिभारित फ़ंक्शन का उपयोग किया जाता है। मैं this संबंधित SO प्रश्न में इन विषयों पर चर्चा करता हूं।
जब आप वास्तव में समारोह में पैरामीटर का उपयोग नहीं कर रहे हैं, लेकिन सार्वजनिक विधि हस्ताक्षर तोड़ने के लिए नहीं करना चाहती।
अलेक्जेंड्रोस ने एक बहुत ही अच्छा उदाहरण दिया है (http://stackoverflow.com/questions/3348223/in-c-in-the-definition-of-functions-the-argument-identifiers-are-optional-in/3348345 # 3348345) क्यों आप वास्तविक वस्तु के बारे में परवाह नहीं कर सकते हैं, सिवाय इसके कि यह वहां है। – sbi
मुझे लगता है कि आप कार्यों की घोषणा में मतलब है। दरअसल, आप कार्यों की परिभाषा में इंडेंटिफायर नाम को भी छोड़ सकते हैं, लेकिन पैरामीटर का उपयोग होने पर यह संकलन त्रुटि का कारण बन जाएगा, जो होने की संभावना है।
कुछ मामलों में, कंपाइलर अप्रयुक्त पैरामीटर की चेतावनी देंगे, जब तक आप पहचानकर्ता नाम को दिखाएंगे। यह दिखाने के लिए भी उपयोगी है कि एक पैरामीटर अप्रयुक्त है। इसके अलावा मुझे कोई जानकारी नहीं है। यदि आप पैरामीटर का उपयोग करते हैं तो आप निश्चित रूप से पहचानकर्ता को नहीं छोड़ सकते हैं।
यह कैसे संकलक पोस्टफ़िक्स और उपसर्ग वेतन वृद्धि ऑपरेटरों अलग करता है - एक्स ऑपरेटर ++() है उपसर्ग, एक्स ऑपरेटर ++ (int) पोस्टफ़िक्स है।
क्योंकि पूर्णांक वास्तव में पोस्टफ़िक्स ऑपरेटर में कभी नहीं प्रयोग किया जाता है, वहाँ यह एक नाम देने के लिए कोई कारण नहीं है। यह आम तौर पर दो अलग-अलग चीजों के अर्थ के लिए फ़ंक्शन या ऑपरेटर को अधिभारित करने के लिए, अनाम नाम पैरामीटर क्यों मिलता है। यह लोकी और बूस्ट में उपयोग किए जाने वाले टेम्पलेट मेटाप्रोग्रामिंग में एक आम चाल है।
आप ओपी को यह स्पष्ट करना चाहते हैं कि इसका कारण यह है कि ओवरलोड रिज़ॉल्यूशन की वजह से ... हालांकि मुझे लगता है कि मैंने अभी किया है। –
नहीं, यह नहीं है। ये अलग-अलग हस्ताक्षर हैं, यानी, तर्कों के प्रकार अलग हैं। ओपी क्या पूछ रहा है कुछ पैरामीटर के पहचानकर्ता को छोड़ने के बारे में है। – Juliano
हू? जोएल दिखा रहा है कि एक कंपाइलर एक अज्ञात पैरामीटर का उपयोग कर ++ i और i ++ के बीच कैसे भेदभाव कर सकता है। तुम्हारी किस बारे में बोलने की इच्छा थी? –
आप यह कर जब आप कुछ हस्ताक्षर के एक समारोह को लागू कर रहे हैं, वास्तव में पैरामीटर (एक सार के पीछे पदानुक्रम में बहुत आम) की जरूरत नहीं है, और बिना चेतावनी के संकलन करने की जरूरत है। चूंकि सभी परियोजनाओं को चेतावनी मिलने पर तोड़ने के लिए सेट किया जाना चाहिए, और यह ओओपी/जीपी में बहुत कम है, यह एक बहुत ही आम बात है। वास्तव में यह बहुत आम है कि कई पुस्तकालयों में बेहतर सुगमता के लिए एक mylibUNUSED() मैक्रो है।
नोट तथ्य यह है कि संकलक वास्तविक पैरामीटर नाम के बारे में परवाह नहीं करता से तथ्य यह है कि आप अलग पैरामीटर नाम एक समारोह (टेम्पलेट) के लिए यह की परिभाषा के लिए की तुलना में की घोषणा का उपयोग कर सकते आता है कि।
यह उपयोगी है जब आपके पास लाइब्रेरी है जिसे आप हेडर के रूप में भेजते हैं और lib फ़ाइल के रूप में और आपके एपीआई का उपयोग करने वाले प्रत्येक व्यक्ति को लाइब्रेरी के अंदर, सबकुछ फिर से संकलित नहीं करना पड़ेगा, आप कुछ के नाम बदलते हैं पैरामीटर (रों)। (शायद आपको इसकी सराहना करने के लिए बहु-एमएलओसी सी ++ प्रोजेक्ट में होना होगा।)
अतिरिक्त पैरामीटर का उपयोग SFINAE द्वारा किया जा सकता है, ओवरलोड रिज़ॉल्यूशन या टाइप गुणों के आधार पर प्रेषण के लिए।
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits.hpp>
#include <boost/call_traits.hpp>
#include <iostream>
#include <string>
// use SFINAE enable this function for numerical types only
template <class T>
double foo(T t, typename
boost::enable_if<boost::is_floating_point<T> >::
type* dummy = 0) {
double x = static_cast<double>(t);
return x;
}
// use extra parameter for overload resolution
struct PlanA {};
struct PlanB {};
void bar(const PlanA&) {
std::cout << "using plan A...\n";
}
void bar(const PlanB&) {
std::cout << "using plan B...\n";
}
// use type traits to choose which function to call
template <typename T>
double fooBar(T t) {
return dispatch(t, boost::is_convertible<T, double>());
}
double dispatch(double t, const boost::true_type&) {
std::cout << "convertible to double\n";
return t+0.1;
}
template <typename T>
double dispatch(const T&, const boost::false_type&) {
std::cout << "not convertible to double\n";
return 0.0;
}
int main() {
foo(1.0);
// foo(1); won't compile
bar(PlanA());
bar(PlanB());
std::string name = "John Dow";
fooBar(1.0);
fooBar(name);
}
- 1. परमाणु गुण किस परिस्थितियों में उपयोगी हैं?
- 2. क्यों सी में एक समारोह की प्रोटोटाइप और परिभाषा भिन्न हो सकती है?
- 3. प्वाइंटर सी कार्यों में तर्क
- 4. सीएसआरएफ-छूट किस मामले में खतरनाक हो सकती है?
- 5. defgeneric में वैकल्पिक तर्क?
- 6. जावा गणनाएं विलय हो सकती हैं (जैसे सी # में बिटवाइज)?
- 7. मेरे पास एक ही फ़ंक्शन में वैकल्पिक तर्क और कीवर्ड तर्क कैसे हो सकते हैं?
- 8. गिट में, स्थानीय शाखाएं एक दूसरे को ट्रैक कर सकती हैं - यह कैसे उपयोगी है?
- 9. सी # में सदस्यों तक पहुंचने पर 'यह' कीवर्ड वैकल्पिक है?
- 10. मुझे वाईएक्स में कम से कम दो वैकल्पिक घटकों की आवश्यकता कैसे हो सकती है?
- 11. सी, चर तर्क कार्यों
- 12. सी ++/सीएलआई वैकल्पिक तर्क
- 13. क्या एक ढेर-आवंटित वस्तु सी ++ में हो सकती है?
- 14. सी और सी ++ में लिखे गए दुभाषिया सी (++) कार्यों के लिए बाध्य पहचानकर्ता
- 15. क्या जीसीसी में नकली हो सकती है?
- 16. फ़ंक्शन परिभाषा में स्टेटिक कीवर्ड फ़ंक्शन परिभाषा में अनुपलब्ध हो सकता है?
- 17. सी # विधि विशेषता में लैम्ब्डा अभिव्यक्ति नहीं हो सकती है?
- 18. क्या वीबी स्क्रिप्ट में कार्यों के लिए वैकल्पिक तर्क बनाने के तरीके हैं?
- 19. मेज क्या है और यह किस तरह से उपयोगी है?
- 20. बड़े परिदृश्य में कौन से परिस्थितियां एक गति उत्पन्न कर सकती हैं?
- 21. क्या यह कॉलबैक की आपकी परिभाषा में फिट है?
- 22. PHPDoc में तर्क कैसे वैकल्पिक है यह चिह्नित करने के लिए?
- 23. क्या नामस्थान वास्तव में ढांचे में उपयोगी हैं?
- 24. सी-शैली भाषाओं में कार्यों में घुंघराले ब्रेसिज़ क्यों वैकल्पिक नहीं हैं?
- 25. फ़ोनगैप एंड्रॉइड ऐप की रक्षा कैसे करें? क्या एंड्रॉइड मार्केट कॉपी सुविधा की सुविधा उपयोगी है?
- 26. क्लासिक सी ++ (कक्षाओं के साथ सी) की कॉल/वापसी सुविधा, आधुनिक भाषाओं में यह क्या है?
- 27. क्या हमारे पास टेम्पलेट तर्क के रूप में अज्ञात संरचना हो सकती है?
- 28. फ़ीड में किस प्रकार की पोस्ट हैं?
- 29. क्या एक डोमेन में एकाधिक कुकीज़ हो सकती हैं?
- 30. कार्यों की सूची में कार्यों की संरचना!
नोट, यह केवल सी ++ के लिए सच है और सी के लिए नहीं। मैं सी टैग के कारण इसका उल्लेख करता हूं। – quinmars
धन्यवाद, मैंने अंतर को रेखांकित करने के लिए सी टैग का उपयोग किया। –
ऐसा नहीं है कि टैग का उपयोग कैसे किया जाता है। यदि मैं "सी" के साथ टैग किए गए सभी विषयों की खोज करता हूं, तो मुझे उन विषयों को खोजने की उम्मीद नहीं है जो सी से प्रासंगिक नहीं हैं। इसका कोई मतलब नहीं है, इसलिए मैंने टैग हटा दिया। –