2010-03-10 31 views
9

Tôi có vectơ con trỏ. Tôi muốn gọi hàm cho mọi phần tử, nhưng hàm đó có tham chiếu. Có một cách đơn giản để dereference các yếu tố?Sử dụng for_each và boost :: liên kết với vectơ của con trỏ

Ví dụ:

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)); 
} 

tôi có thể tạo ra một wrapper bẩn ít mà mất một con trỏ, nhưng tôi figured có phải là một cách tốt hơn?

+0

Có lý do nào bạn đang sử dụng 'boost :: ref (* this)' không? Tôi chỉ sử dụng: boost :: bind (& MyClass :: ReferenceFn, this, _1) và nó hoạt động tốt. –

Trả lời

15

Bạn có thể sử dụng boost::indirect_iterator:

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

Đó sẽ dereference iterator chuyển thể hai lần trong operator* của nó.

+4

+1, mặc dù trong trường hợp này tôi thích 'BOOST_FOREACH (Element * e, elements) this-> ReferenceFn (* e);'. C++ có thể được sử dụng như một ngôn ngữ chức năng, nhưng không phải là ngôn ngữ chức năng * súc tích * –

+0

Và Python sẽ là 'cho e trong các phần tử: self.ReferenceFn (e)'. Đó là trái tim. –

+4

Đối với C++ 0x, nó sẽ là 'for (auto * e: elements) ReferenceFn (* e);'. Sweet :) –

3

Dường như bạn cũng có thể sử dụng thư viện Boost.Lambda.

// 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)); 

Nhưng tôi đồng ý với những người nhận xét về thích BOOST_FOREACH. Thuật toán "for_each" thực tế không có gì hữu ích và nó hoạt động như thế nào, phạm vi dựa trên vòng lặp có thể làm cho bạn với một nỗ lực nhỏ hơn nhiều.

Các vấn đề liên quan