एक अन्य आम-ish उपयोग "पैरामीटर वस्तुओं के साथ है "। विधि श्रृंखला के बिना, वे स्थापित करने के लिए काफी असुविधाजनक हैं, लेकिन इसके साथ वे अस्थायी हो सकते हैं।
बजाय:
complicated_function(P1 param1 = default1, P2 param2 = default2, P3 param3 = default3);
लिखें:
struct ComplicatedParams {
P1 mparam1;
P2 mparam2;
P3 mparam3;
ComplicatedParams() : mparam1(default1), mparam2(default2), mparam3(default3) {}
ComplicatedParams ¶m1(P1 p) { mparam1 = p; return *this; }
ComplicatedParams ¶m2(P2 p) { mparam2 = p; return *this; }
ComplicatedParams ¶m3(P3 p) { mparam3 = p; return *this; }
};
complicated_function(const ComplicatedParams ¶ms);
अब मैं इसे कॉल कर सकते हैं:
complicated_function(ComplicatedParams().param2(foo).param1(bar));
फोन करने वाले मापदंडों के आदेश को याद करने की जरूरत नहीं है जिसका मतलब है ।बिना विधि श्रृंखलन होगा होने के लिए:
ComplicatedParams params;
params.param1(foo);
params.param2(bar);
complicated_function(params);
मैं भी कॉल कर सकते हैं:
complicated_function(ComplicatedParams().param3(baz));
कि भार के की एक टन को परिभाषित करने के बिना, मैं सिर्फ पिछले पैरामीटर निर्दिष्ट कर सकते हैं और इसका मतलब है डिफ़ॉल्ट रूप से बाकी छोड़ दें।
अंतिम स्पष्ट ट्वीक complicated_function
ComplicatedParams
के एक सदस्य बनाने के लिए है:
struct ComplicatedAction {
P1 mparam1;
P2 mparam2;
P3 mparam3;
ComplicatedAction() : mparam1(default1), mparam2(default2), mparam3(default3) {}
ComplicatedAction ¶m1(P1 p) { mparam1 = p; return *this; }
ComplicatedAction ¶m2(P2 p) { mparam2 = p; return *this; }
ComplicatedAction ¶m3(P3 p) { mparam3 = p; return *this; }
run(void);
};
ComplicatedAction().param3(baz).run();
स्रोत
2011-11-16 10:26:16
मुख्य दोष यह है कि आप लौट जा सकता है 'है * एक' एक और ', और जैसा कि this'' लेखन ए * एक = नया एक। ए-> setA()। setB() 'या (अधिक महत्वपूर्ण) 'ए बी; । B.setA() setb(); '। 'b.setA() -> setB(); 'थोड़ा कचरा है ;-) –