2009-07-21 56 views
7

Tôi đang bối rối như những gì tăng :: ràng buộc hiện khi chúng tôi liên kết với các biến thành viên. Với việc liên kết với hàm thành viên, về cơ bản chúng ta tạo ra một đối tượng hàm, và sau đó gọi nó tới đối số được cung cấp hoặc bị trì hoãn và được thay thế qua trình giữ chỗ.Ràng buộc với biến thành viên

Nhưng những gì hiện biểu hiện này làm đằng sau hậu trường:

boost::bind(&std::pair::second, _1); 

gì bị thay thế ở vị trí của placeholder _1?

Tôi tìm thấy điều này trong khi đọc ví dụ này từ một bài viết về tăng :: ràng buộc:

void print_string(const std::string& s) { 
    std::cout << s << '\n'; 
} 

std::map<int,std::string> my_map; 
my_map[0]="Boost"; 
my_map[1]="Bind"; 

std::for_each(
    my_map.begin(), 
    my_map.end(), 
    boost::bind(&print_string, boost::bind(
     &std::map<int,std::string>::value_type::second,_1))); 

source

Trả lời

4

Đằng sau những cảnh nó đang sử dụng một con trỏ thành viên và áp dụng nó để thông qua tại tranh luận. Nó khá phức tạp trong bối cảnh liên kết, vì vậy đây là một ví dụ đơn giản về con trỏ đến việc sử dụng thành viên:

int main() 
{ 
    std::pair< int, int > p1 = make_pair(1, 2); 
    std::pair< int, int > p2 = make_pair(2, 4); 
    int std::pair<int,int>::*ptr = &std::pair<int,int>::second; // pointer to second member 

    std::cout << p1.*ptr << std::endl; // 2 dereference pointer to member 
    std::cout << p2.*ptr << std::endl; // 4 dereference pointer to member 
} 

Đằng sau khung cảnh là soạn các cuộc gọi khác nhau. Hàm functor kết quả lấy tham số của std :: map <> :: iterator (thuộc loại std :: pair < const key_type, value_type>). Điều đó được chuyển đến ràng buộc bên trong, điều đó dẫn đến con trỏ thành viên, do đó trả về (*it).second cho ràng buộc bên ngoài chuyển giá trị đó đến phương thức print_string cho cuộc gọi cuối cùng: print_string((*it).second).

(*it) thực sự là số _1 bạn đã hỏi. Tất cả _# là trình giữ chỗ, có nghĩa là, kết quả của liên kết sẽ là một hàm functor sẽ nhận nhiều đối số như các trình giữ chỗ khác nhau tồn tại theo thứ tự được xác định bởi số phần giữ chỗ. Trong ví dụ bạn đưa ra, hàm functor nhận một đối số đơn lẻ _1.

2
boost::bind(&std::pair<U,V>::second, _1); 

là chức năng tương đương để

std::pair<U,V> p -> p.second 

tức. nó là một hàm (đối tượng) ánh xạ một số pair<U,V> đến thành viên second của nó.

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