for each
कुलपति ++ में बयान, जब एक गैर-प्रबंधित वर्ग पर इस्तेमाल किया:
for (auto iter = xs.begin(), end = xs.end(); iter != end; ++iter)
{
T x = *iter;
}
कहाँ auto
मतलब है चर के प्रकार से स्वचालित रूप से निष्कर्ष निकाला है:
for each (T x in xs)
{
...
}
इस के लिए बस वाक्यात्मक चीनी है प्रारंभकर्ता का प्रकार।
दूसरे शब्दों में, आपको begin()
और end()
अपनी कक्षा पर विधियों को प्रदान करने की आवश्यकता है जो इसके लिए प्रारंभ और अंत इनपुट इटरेटर्स लौटाएंगे।
यहाँ वर्ग का एक उदाहरण है कि एक istream
लपेटता है और आप इसे में सभी लाइनों पर चीज़ों को दोहरा सकते है:
#include <istream>
#include <iostream>
#include <fstream>
#include <string>
class lines
{
public:
class line_iterator
{
public:
line_iterator() : in(0)
{
}
line_iterator(std::istream& in) : in(&in)
{
++*this;
}
line_iterator& operator++()
{
getline(*in, line);
return *this;
}
line_iterator operator++ (int)
{
line_iterator result = *this;
++*this;
return result;
}
const std::string& operator*() const
{
return line;
}
const std::string& operator->() const
{
return line;
}
friend bool operator== (const line_iterator& lhs, const line_iterator& rhs)
{
return (lhs.in == rhs.in) ||
(lhs.in == 0 && rhs.in->eof()) ||
(rhs.in == 0 && lhs.in->eof());
}
friend bool operator!= (const line_iterator& lhs, const line_iterator& rhs)
{
return !(lhs == rhs);
}
private:
std::istream* const in;
std::string line;
};
lines(std::istream& in) : in(in)
{
}
line_iterator begin() const
{
return line_iterator(in);
}
line_iterator end() const
{
return line_iterator();
}
private:
std::istream& in;
};
int main()
{
std::ifstream f(__FILE__);
for each (std::string line in lines(f))
{
std::cout << line << std::endl;
}
}
नोट वास्तव में for each
द्वारा आवश्यक न्यूनतम की तुलना में कुछ बड़ा है कि line_iterator
के कार्यान्वयन; तथापि, यह कम से कम कार्यान्वयन कि इनपुट इटरेटर आवश्यकताओं के अनुरूप है, और इस तरह इस वर्ग के भी सभी एसटीएल एल्गोरिदम कि इनपुट iterators पर काम के साथ प्रयोग करने योग्य है, इस तरह के रूप std::for_each
, std::find
आदि
स्रोत
2009-10-26 17:34:22
एमएस संकलक समर्थित कभी नहीं anyting उपयोग करने के लिए IEnumerable वारिस चाहिए। मुझे लगता है कि आप किसी अन्य भाषा के बारे में बात कर रहे हैं। सी#? यदि ऐसा है, तो आपको अपने प्रश्न को पुनः प्राप्त करने की आवश्यकता है। – AnT
http://msdn.microsoft.com/en-us/library/ms177202%28VS.80%29.aspx – stelonix
शायद सी ++ टैग एक वीसी ++ टैग होना चाहिए। यह निश्चित रूप से एक मानक सी ++ सवाल नहीं है। – MAK