2013-02-28 28 views
14

Có cách nào tôi có thể gửi đối số cho deleter của std::shared_ptr?Các đối số bổ sung cho deleter tùy chỉnh của shared_ptr

cái gì đó sẽ cảm thấy như:

std::shared_ptr<A> myA(a, myDeleter(a, 5)); 

nơi myDeleter có chữ ký này:

void myDeleter(A* a, int i) 

(Rõ ràng là cú pháp trên là sai, nhưng chỉ để nhấn mạnh rằng tôi cần deleter tôi để mất thêm đối số.)

Trả lời

24

Bạn có thể std::bind đối số thứ hai của deleter của bạn trước khi chuyển nó làm deleter:

auto deleter = std::bind(myDeleter, std::placeholders::_1, 5); 
std::shared_ptr<A> myA(a, deleter); 

Ngoài ra, deleter của bạn có thể là một functor mà mất int qua constructor của nó:

struct myDeleter 
{ 
    myDeleter(int); 
    void operator()(A*); 
}; 

myDeleter deleter(5); 
std::shared_ptr<A> myA(a, deleter); 

Hoặc bạn có thể sử dụng một biểu thức lambda:

std::shared_ptr<A> myA(a, [](A* a){ myDeleter(a, 5); }); 
+1

brill. cảm ơn nhiều! tại sao lambdas chỉ được giới thiệu gần đây trong C++ ?! – alexandreC

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