2013-04-01 17 views
5

std::function có thể chứa các chức năng của thành viên, do đó, nó phải lưu một con trỏ đến đối tượng đối tượng ở đâu đó.Cách lấy con trỏ này từ std :: function?

Làm cách nào để tìm nạp con trỏ this từ số std::function có chức năng thành viên?

+0

Bạn có xem qua không, ví dụ: http://en.cppreference.com/w/cpp/utility/functional/function? –

+0

@OliCharlesworth. Tất nhiên là tôi đã làm. Cho tôi biết nếu tôi bị mù với câu trả lời. – danijar

+1

Tôi khá chắc chắn rằng loại thông tin này là cố ý không được tiếp xúc trong thư viện, và do đó không thể tiếp cận một cách di động. –

Trả lời

8

Một đối tượng thuộc loại std::function giữ một đối tượng có thể gọi có thể gọi. Một con trỏ đến hàm thành viên là một loại đối tượng có thể gọi được; nó có thể được gọi với một đối số của loại lớp thích hợp, cộng với bất kỳ đối số bổ sung nào mà nó cần. Ví dụ:

struct S { 
    void f(int); 
}; 
std::function<void(S, int)> g(&S::f); 

Để gọi nó, vượt qua một đối tượng kiểu S:

S s; 
g(s, 3); 

Lưu ý rằng đối tượng std::function không không giữ một đối tượng S; chỉ khi bạn gọi nó là con trỏ hàm bị ràng buộc với một đối tượng.

+1

Mục tiêu của tôi là unwrap lambdas Tôi đã chuyển thành 'std :: function' thành một hàm khác. Làm thế nào tôi có thể làm như vậy sau đó? Bằng cách unwrapping tôi có nghĩa là để chia nó thành một con trỏ 'this' và một con trỏ chức năng tĩnh bằng cách sử dụng' std :: function :: target' để tiếp tục xử lý. – danijar

+3

@danijar: Tại sao bạn không đặt mục tiêu của mình vào câu hỏi? Câu hỏi của bạn có ý nghĩa rất ít. – GManNickG

+0

@danijar bạn có thể tạo đối tượng hàm của riêng bạn liên kết một con trỏ 'this' và cho phép truy xuất. – Pubby