निम्नलिखित को देखते हुए:क्या मैं एक सी ++ फंक्शन लिख सकता हूं जो कच्चे सूचक और स्मार्ट पॉइंटर दोनों को स्वीकार करता है?
struct Foo
{
int bar() const;
};
struct IsEqual : public std::unary_function<Foo*, bool>
{
int val;
IsEqual(int v) : val(v) {}
bool operator()(const Foo* elem) const
{
return elem->bar() == val;
}
};
मैं Foo*
के एक कंटेनर है और मैं std::find_if
और std::not1
का उपयोग पता लगाने के लिए अगर वहाँ कंटेनर में किसी भी तत्व हैं जहां bar()
रिटर्न कुछ एक दिया मूल्य से अलग। भविष्य में
// Are all elements equal to '2'?
bool isAllEqual(const std::vector<Foo*> &vec)
{
return find_if(vec.begin(), vec.end(), std::not1(IsEqual(2))) == vec.end();
}
फास्ट आगे और अब मैं एक अलग कंटेनर है, इस बार std::tr1::shared_ptr<Foo>
युक्त कोड इस तरह दिखता है। मुझे isAllEqual()
के अधिभारित संस्करण में बस अपने मज़ेदार का फिर से उपयोग करना अच्छा लगेगा। लेकिन मैं नहीं कर सकता। Foo*
और shared_ptr<Foo>
विभिन्न प्रकार हैं। और मुझे unary_function
से उत्तराधिकारी होने की आवश्यकता है, इसलिए मैं not1
का उपयोग कर सकता हूं। अगर मैं दो बार एक ही मजेदार लिखने से बच सकता तो यह और अधिक सुरुचिपूर्ण होगा।
सवाल:
- वहाँ किसी भी तरह से
IsEqual
तो यह दोनों कच्चे और स्मार्ट संकेत का उपयोग कर सकते लिखने के लिए है? - क्या मैंने
std::not1
का उपयोग करके खुद को हाथ से पकड़ा? क्या मुझे इसके बजायIsNotEqual
लिखना चाहिए?
प्रतिबंध:
- मैं बढ़ावा पुस्तकालय से कुछ भी उपयोग नहीं कर सकते।
- हमारा कंपाइलर C++ 0x lambdas का समर्थन करने के लिए पर्याप्त ठंडा नहीं है।
यह एक उदाहरण की तरह लगता है जहां टेम्पलेट्स अच्छा होगा। – GWW
@ क्रिस्टो: क्या आपका कंपाइलर अन्य सी ++ 0x सामान प्रदान करने के लिए पर्याप्त ठंडा है, जैसे 'std :: start'? –
@ बेन, हम जीसीसी 4.1.2 का उपयोग कर रहे हैं, तो शायद नहीं। 'std :: start' और' std :: end' लिखने के लिए तुच्छ होना चाहिए। –