2010-03-10 10 views
9

İşaretçilerden oluşan bir vektör var. Her eleman için bir işlevi çağırmak istiyorum, ancak bu fonksiyon bir referans alır. Unsurları ortadan kaldırmak için basit bir yol var mı?For_each ve boost'u kullanma :: işaretçi bir vektörle bağlama

Örnek:

MyClass::ReferenceFn(Element & e) { ... } 

MyClass::PointerFn(Element * e) { ... } 

MyClass::Function() 
{ 
    std::vector< Element * > elements; 
    // add some elements... 

    // This works, as the argument is a pointer type 
    std::for_each(elements.begin(), elements.end(), 
        boost::bind(&MyClass::PointerFn, boost::ref(*this), _1)); 

    // This fails (compiler error), as the argument is a reference type 
    std::for_each(elements.begin(), elements.end(), 
        boost::bind(&MyClass::ReferenceFn, boost::ref(*this), _1)); 
} 

Ben bir işaretçi alır kirli küçük sarmalayıcı oluşturmak olabilir, ama orada anladım daha iyi bir yolu olmalıydı?

+0

Boost :: ref (* this) 'işlevini kullanmanın bir nedeni var mı? Ben sadece kullanıyorum: boost :: bind (& MyClass :: ReferenceFn, bu, _1) ve iyi çalışıyor. –

cevap

15

Sen boost::indirect_iterator kullanabilirsiniz:

std::for_each(boost::make_indirect_iterator(elements.begin()), 
       boost::make_indirect_iterator(elements.end()), 
       boost::bind(&MyClass::ReferenceFn, boost::ref(*this), _1)); 

Yani olacak iki kez operator* uyarlanmıştır yineleyici KQUEUE.

+4

+1, bu durumda BOOST_FOREACH (Element * e, elements) öğesini tercih etsem de bu ReferenceFn (* e); '. C++ işlevsel bir dil olarak kullanılabilir, ama * özlü * işlevsel bir dil olarak kullanılamaz ... –

+0

Ve Python, elemanlar için e: self.ReferenceFn (e) 'olacaktır. Bu kalp kırıyor. –

+4

C++ 0x için, (auto * e: elements) ReferenceFn (* e); 'için olacaktır. Tatlı :) –

3

Boost.Lambda kitaplığını da kullanabilirsiniz.

// Appears to compile with boost::lambda::bind 
    using namespace boost::lambda; 
    std::for_each(elements.begin(), elements.end(), 
        bind(&MyClass::ReferenceFn, boost::ref(*this), *_1)); 

Ama BOOST_FOREACH tercih hakkında yorum yapanlar katılıyorum. for_each "algoritması" pratikte hiçbir işe yaramıyor ve ne işe yaramadıysa, döngüye göre kapsama alanı çok daha küçük bir çabayla sizin için yapabilir.

İlgili konular