2009-03-12 29 views
8

Tôi có một vùng chứa con trỏ mà tôi muốn lặp lại, gọi hàm thành viên có tham số là tham chiếu. Làm thế nào để làm điều này với STL?std :: for_each, gọi hàm thành viên với tham số tham chiếu

Giải pháp hiện tại của tôi là sử dụng boost :: bind và boost :: ref cho tham số.

// Given: 
// void Renderable::render(Graphics& g) 
// 
// There is a reference, g, in scope with the call to std::for_each 
// 
std::for_each(
    sprites.begin(), 
    sprites.end(), 
    boost::bind(&Renderable::render, boost::ref(g), _1) 
); 

Câu hỏi liên quan (từ đó tôi lấy được giải pháp hiện tại của tôi từ) là boost::bind with functions that have parameters that are references. Điều này đặc biệt yêu cầu làm thế nào để làm điều này với tăng. Tôi hỏi làm thế nào nó sẽ được thực hiện mà không cần tăng.

Chỉnh sửa: Có cách để làm điều tương tự này mà không cần sử dụng bất kỳ boost nào. Bằng cách sử dụng std::bind và bạn bè cùng mã có thể được viết và biên soạn trong một trình biên dịch 11-tương thích C++ như thế này:

std::for_each(
    sprites.begin(), 
    sprites.end(), 
    std::bind(&Renderable::render, std::placeholders::_1, std::ref(g)) 
); 
+0

boost :: bind (& Renderable :: render, _1, boost :: ref (g)) có lẽ nên được tăng :: bind (& Renderable :: render, boost :: ref (g), _1) – Carl

+0

@carleeto Tốt bắt lấy. Cố định sau 4 năm sai! –

Trả lời

5

Đây là vấn đề với thiết kế <functional>. Bạn phải sử dụng boost :: bind hoặc tr1 :: bind.

+0

yep, thật đáng buồn: (biết thêm thông tin về điều này: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2000/n1245.ps và http://www.open-std.org /jtc1/sc22/wg21/docs/cwg_defects.html#106 dường như chưa bao giờ được đưa vào tiêu chuẩn Nhưng nó nằm trong phần tiếp theo :) –

+0

Có, các vấn đề tham chiếu đến tham chiếu chính xác là vấn đề của tôi. Cảm ơn bạn về thông tin! –

3

Check-out How to use std::foreach with parameters/modification. Câu hỏi cho thấy làm thế nào để làm điều đó bằng cách sử dụng một vòng lặp for. Câu trả lời được chấp nhận đưa ra một ví dụ về cách đạt được điều này với thuật toán for_each.

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