2011-10-30 14 views
10

Giả sử tôi có một hàm functor, không thể quét được nhưng có thể di chuyển được, làm cách nào để lưu trữ nó trong một hàm std ::? tức là, làm cách nào để biên dịch mã sau? (sử dụng gcc 4.6)Lưu trữ đối tượng không thể quét được nhưng có thể di chuyển trong tiêu chuẩn :: function

#include <functional> 
#include <iostream> 

struct S 
{ 
    S() = default; 
    S(S const&) = delete; 
    S& operator=(S const&) = delete; 
    S(S&&) { } 
    void operator()() { } 
}; 

std::function<void()> func; 

void make_func() 
{ 
    S s; 
    func = std::bind(std::move(s)); // This won't compile 
} 

int main() 
{ 
    make_func(); 
} 
+0

sẽ không hoạt động vì 's' là cục bộ và nằm ngoài phạm vi ... – Yahia

+0

' std :: function <> 'không chứa đối tượng có thể gọi nó được kết thúc tốt đẹp (tôi giả sử chính xác là _avoid_ yêu cầu họ được tôi di chuyển/copyable). – sehe

+0

Có thể nếu bạn thiết kế lại mã của mình và bạn có thể * khởi tạo * 'std :: function'. Ví dụ, công trình này 's s; std :: function func (std :: ref (s)); func(); '. Nhưng bạn cũng phải làm cho 's' không đi ra khỏi phạm vi trước khi' func' có nghĩa là nó phải toàn cầu theo một nghĩa nào đó. Nhưng vẫn bạn * có thể * lưu trữ một đối tượng di chuyển trong 'std :: function' (với các hạn chế) nếu đó là câu hỏi của bạn. – alfC

Trả lời

2

Theo tôi hiểu tiêu chuẩn, std::function được cho là có thể sao chép được. Do đó, bạn không thể trực tiếp đạt được những gì bạn muốn.

Bạn có thể loại bỏ một số trình bao bọc tùy chỉnh mà tôi đoán. Nó sẽ giống như sau:

  • làm cho trình bao bọc của bạn chứa std::shared_ptr cho hàm thực tế;
  • khi trình bao bọc được tạo từ giá trị functor, di chuyển functor sang bộ nhớ được cấp phát động;
  • trình tạo bản sao cho trình bao bọc và trình phá hủy được xử lý đơn giản bởi shared_ptr copy-ctor/destructor;
  • operator() đối với các tham chiếu bao bọc, con trỏ thông minh tới functor thực và các đại biểu đến operator() trên đó.
+1

Tập thể dục cho người đọc? Thực hiện điều này bằng cách sử dụng các mẫu variadic và chuyển tiếp hoàn hảo các kiểu đối số. – sehe

+0

Cảm ơn doublep, đáp ứng nhu cầu hiện tại của tôi. –

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