हालांकि बूस्ट।पैरामीटर मनोरंजक है, यह (दुर्भाग्य से) ग्रस्त मुद्दों, जो बीच में टक्कर प्लेसहोल्डर (और विचित्र preprocessors/टेम्पलेट त्रुटियों डिबग करने वाले) के एक नंबर के लिए:
BOOST_PARAMETER_NAME(p1)
_p1
प्लेसहोल्डर है कि आप तो बाद में उपयोग करने का निर्माण करेगा। यदि आपके पास एक ही प्लेसहोल्डर घोषित करने वाले दो अलग-अलग शीर्षलेख हैं, तो आपको एक संघर्ष मिलता है। मज़ा नहीं।
एक बहुत सरल (दोनों धारणात्मक और व्यावहारिक रूप से) जवाब है, Builder
पैटर्न के आधार पर नहीं है कुछ हद तक नाम पैरामीटर मुहावरा है।
इसके बजाय इस तरह के एक समारोह को निर्दिष्ट करने के
:
void f(int a, int b, int c = 10, int d = 20);
आप एक संरचना निर्दिष्ट करते हैं, जिस पर आप को पार कर जाएगी operator()
:
- निर्माता (अनिवार्य तर्क के लिए पूछने के लिए प्रयोग किया जाता है सख्ती से नहीं में नामित पैरामीटर्स इडियॉम, लेकिन किसी ने भी नहीं कहा कि आपको इसे अंधाधुंध पालन करना होगा), और डिफ़ॉल्ट मान
- प्रत्येक वैकल्पिक पैरामीटर को एक सेटटर
दिया गया है
आम तौर पर, यह चेनिंग के साथ संयुक्त है जिसमें सेटर्स वर्तमान ऑब्जेक्ट का संदर्भ लौटाते हैं ताकि कॉल को एक पंक्ति पर जंजीर किया जा सके।
class f {
public:
// Take mandatory arguments, set default values
f(int a, int b): _a(a), _b(b), _c(10), _d(20) {}
// Define setters for optional arguments
// Remember the Chaining idiom
f& c(int v) { _c = v; return *this; }
f& d(int v) { _d = v; return *this; }
// Finally define the invocation function
void operator()() const;
private:
int _a;
int _b;
int _c;
int _d;
}; // class f
मंगलाचरण है:
f(/*a=*/1, /*b=*/2).c(3)(); // the last() being to actually invoke the function
मैं एक प्रकार operator()
को पैरामीटर के रूप में अनिवार्य तर्क डाल देखा है, इस गुण के रूप में तर्क रखने से बचा जाता है लेकिन वाक्य रचना एक सा weirder है:
f().c(3)(/*a=*/1, /*b=*/2);
एक बार संकलक ने सभी कन्स्ट्रक्टर और सेटर्स कॉल को रेखांकित किया है (यही कारण है कि उन्हें यहां परिभाषित किया गया है, जबकि operator()
नहीं है), इसे res "नियमित" फ़ंक्शन आमंत्रण की तुलना में समान कुशल कोड में अल्ट।
आप वास्तव में क्या हासिल करना चाहते हैं? मुझे यह महसूस हो रहा है कि आप जो कुछ भी करने की कोशिश कर रहे हैं उसे सरल तरीके से किया जा सकता है। उपरोक्त कोड एक रखरखाव दुःस्वप्न की शुरुआत की तरह दिखता है। –
@ एंडर्सके। यह निर्दिष्ट करने का एक तरीका है कि मैं किस तर्क का उपयोग करना चाहता हूं। मैं मानता हूं कि यह नहीं किया जाना चाहिए, लेकिन यदि संभव हो तो मैं अभी भी उत्सुक हूं। – Pubby
क्या आपको वाकई इसकी आवश्यकता है? आपको तर्कों के तर्क (एन!) रूपों पर विचार करना होगा। 4! = 24 परिभाषाएं। यह सभी पैरामीटर –