aşağıdaki biraz "kötü" olduğunu, ancak birçok hata bizi kurtardı.
(Güncelleme, @ Ricky65'in bana buradan geri bildirim yapmak için yaptığı yorum sayesinde teşekkür ederiz.) C++ 11, derleyiciniz destekliyorsa bundan çok daha üstün olan bir range-based for loop'a sahiptir; Yine de bazı gerçekten eski derleyicilerle çalışıyoruz.
#define FOREACH(iter,stlContainer) \
for (typeof(stlContainer.begin()) iter = stlContainer.begin(), \
iter##End_Cached = stlContainer.end(); \
iter != iter##End_Cached; \
++iter)
(Ayrıntılı güncelleme, Boost devs kredi.) Bu gevşek küçük vakalar için hata ayıklama yapılarında gezinmek için daha kolay olma daha karmaşık ama makro BOOST_FOREACH
daha yetenekli, ama vardır avantaj dayanmaktadır, ve boost başlıklarının küçük bir yığınını gerektirmez (bazı kod tabanlarında/gruplarında verboten bulunur).
- kullanıcıları
bind1st
/bind2nd
/ptr_fun
/mem_fun
önemsiz olmayan "ziyareti" için etkili bir şekilde kullanmak için arasındaki etkileşimler hakkında çok şey bilmesi gerekir: - std::for_each
kullanma genellikle tercih edilir, ama bazı dezavantajları vardır Boost, bu sorunların çoğunu giderir, ancak herkesin, tek bir kullanım noktası için kendi ayrı bir funkerini (genellikle bir yapı) sağlaması gerekebilir; Söz konusu yapıların ilmiği çevreleyen işlev içinde, ilgili kodun "yerelliksiz" olmasına yol açacak şekilde bildirilemez - bazı durumlarda fonksiyonun geri kalanıyla aynı mantığa sahip olduğu gibi okur
- değil her zaman güzel inline derleyici bağlı gelmez
yukarıda listelenen forEach makro birkaç şey sağlar: Eğer sınır testleri yanlış almazsınız, std::for_each
gibi
- (Sonu geçmeyen, vb.)
- kullanacaktır Sabit kaplarda
Bir standart olmayan "typeof" uzantısı gerektirdiğini unutmayın.
list< shared_ptr<Thing> > m_memberList;
// later
FOREACH(iter, m_memberList)
{
if ((*iter)->getValue() < 42) {
doSomethingWith(*iter);
}
}
bu makro ile tamamen memnun değilim ama STL-farkında tasarımda olduğu kadar deneyimi olmayan özellikle programcılar için, burada çok değerli olmuştur:
Tipik kullanım olabilir.
(Yanıtı güncelleriz artıları/eksileri/kusurları işaret etmek çekinmeyin.)
Bu soru gerçekten yararlı buluyorum. Bununla birlikte, işe yaramaz bazı cevaplar ... ... ve katkıda bulunan herkese göre. – AndreasT