2011-05-01 41 views
6

Có thể nào đó bằng cách nào đó so sánh hai đối tượng std::tr1::function<> không? Điều gì sẽ xảy ra nếu tôi có một bộ sưu tập gồm function<void(int,float)> đối tượng và muốn thêm và xóa trình xử lý sự kiện? Thêm là tầm thường, nhưng việc tìm ra một cái để xóa có vẻ là không thể.So sánh std :: function <>

+2

@ James: Tôi không đồng ý. Câu hỏi không hỏi tại sao nó không phải là, nó hỏi nếu nó được. Nếu bạn muốn tìm câu hỏi đó, bạn phải biết rằng nó không phải là. – Puppy

+0

@DeadMG: đủ công bằng, nhưng trùng lặp của [So sánh các đối tượng std :: tr1 :: function <>] (http://stackoverflow.com/questions/89488/comparing-stdtr1function-objects), sau đó –

+0

@mmutz: Chúng ' lại gần, nhưng tôi vẫn sẽ không gọi dupe. Các TR1 libs có thể có một đặc tả khác với các libs C++ 0x. – Puppy

Trả lời

3

Dựa trên thông tin từ Stack Overflow tại liên kết sau, nó có thể nhưng chỉ khi bạn bọc đối tượng std :: function trong lớp riêng của nó.

std::vector of std::function

Bằng cách sử dụng một lớp wrapper, bạn có thể kiểm tra xem hai bọc con trỏ std :: chức năng đều bình đẳng, nhưng điều đó không nói lên điều gì về những gì std :: chức năng kết thúc tốt đẹp. Vì vậy, việc thay đổi thiết kế của bạn có lẽ là một cách tiếp cận tốt hơn.

chỉnh sửa: Tôi đã quay lại để hiển thị cách tôi đã giải quyết được vấn đề rất giống nhau.

0) Typedefs cho conciseness.

using std::placeholders; 
    typedef std::function < void (int, float) > some_func; 
    typedef std::pair < intptr_t, intptr_t > method_hash; 
  1. Viết bộ sưu tập của các đối tượng std :: chức năng bằng cách liên kết trỏ đến các phương pháp hoặc các chức năng. Bạn đang làm điều này cho các hàm tĩnh, bỏ qua some_object_ptr.

    some_func some_method (std::bind (some_method_ptr, 
                some_object_ptr, _1, _2) 
    
  2. Sử dụng std :: reinterpret_cast < intptr_t> để tạo một hash duy nhất cho chức năng của bạn, và sử dụng nó với std :: cặp để làm như vậy đối với phương pháp này.

    method_hash pairID (reinterpret_cast <intptr_t> (some_object_ptr), 
             reinterpret_cast <intptr_t> (some_method_ptr)); 
    
  3. Bây giờ pairID của bạn có thể được lưu trữ trong một vector hoặc container/mảng khác. Chỉ cần chắc chắn để duy trì rằng các chỉ số được căn chỉnh sao cho một băm luôn luôn tương ứng với đối tượng std :: function chính xác, và sau đó bạn có thể sử dụng find() để nhận một iterator tới vị trí và khoảng cách() của nó để chuyển đổi trình vòng lặp tới chỉ mục bắt buộc.

Lưu ý rằng điều này sẽ phải được thực hiện mỗi khi vùng chứa của bạn được tạo. Vì nó dựa trên các con trỏ, các băm sẽ thay đổi theo các chương trình khác nhau của bạn.

7

Không thể hoàn thành, hãy đặt đơn giản. std::function (trong tất cả các lần lặp lại của nó, bao gồm boost::functionstd::tr1::function) không hỗ trợ operator==.

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