Tôi gặp khó khăn trong việc tìm ra sự khác biệt giữa hai hàm bao hàm std::function
và std::mem_fn
. Từ các mô tả, có vẻ như với tôi rằng std :: function hiện tất cả mọi thứ std::mem_fn
hiện và nhiều hơn nữa. Trong trường hợp nào người dùng sẽ sử dụng std::mem_fn
trên std::function
?Sự khác nhau giữa std :: function và std :: mem_fn
Trả lời
Bạn thực sự không thể so sánh std::function
với std::mem_fn
. Trước đây là một mẫu lớp có kiểu bạn chỉ định, và sau đó là một mẫu hàm với kiểu trả về không xác định. Có thực sự không phải là một tình huống mà trong đó bạn thực sự xem xét một so với khác.
So sánh tốt hơn có thể là giữa mem_fn
và std::bind
. Ở đó, đối với trường hợp sử dụng cụ thể của một con trỏ tới thành viên, mem_fn
sẽ tốn ít chi tiết hơn nếu tất cả những gì bạn muốn làm là truyền qua tất cả các đối số. Với loại hình này rất đơn giản:
struct A {
int x;
int getX() { return x; }
int add(int y) { return x+y; }
};
A a{2};
Làm thế nào bạn sẽ làm cho một functor mà chỉ gọi getX()
trên A
được?
auto get1 = std::mem_fn(&A::getX);
auto get2 = std::bind(&A::getX, _1);
get1(a); // yields 2
get2(a); // same
Và có một đối số bổ sung cho add
?
auto add1 = std::mem_fn(&A::add);
auto add2 = std::bind(&A::add, _1, _2);
add1(a, 5); // yields 7
add2(a, 5); // same
Vì vậy mem_fn
ngắn gọn hơn trong trường hợp này. Tuy nhiên, nếu chúng ta muốn để ràng buộc một lập luận cụ thể, chẳng hạn gọi add(5)
trên A
nhất định, bạn chỉ có thể làm điều đó với bind
:
auto add_5 = std::bind(&A::add, _1, 5);
add_5(a); // yields 7
Cuối cùng, không có so sánh giữa function
và mem_fn
, nhưng có những thời điểm thích mem_fn
đến bind
.
Trình bao bọc được trả về bởi std::mem_fn
cực kỳ nhẹ; đó là một wrapper mỏng xung quanh một con trỏ đến thành viên.
std::function
sử dụng loại tẩy xóa, nặng hơn rất nhiều.
- 1. Sự khác biệt giữa std: string và std :: string
- 2. sự khác biệt giữa std :: di chuyển và std :: mong
- 3. Whats sự khác biệt giữa std :: condition_variable và std :: condition_variable_any?
- 4. Sự khác nhau giữa std :: cuối (MyVector) và myVector.end()
- 5. Sự khác nhau giữa tăng :: container :: vector và std :: vector
- 6. Hiểu std :: function và std :: bind
- 7. Sự khác nhau giữa std :: quick_exit và std :: abort và lý do std :: quick_exit cần thiết là gì?
- 8. Sự khác nhau giữa `$ (cửa sổ) .load (function() {})` và `$ (function() {})`
- 9. Sự khác nhau giữa std :: set và std :: vector là gì?
- 10. Sự khác nhau giữa std :: partial_sum và std :: inclusive_scan là gì?
- 11. Sự khác biệt giữa std :: uninitialized_copy & std :: copy?
- 12. Hành vi khác nhau giữa libstdC++ và libC++ khi xây dựng std :: function with lambda
- 13. std :: bind to std :: function?
- 14. G ++, clang ++ và std :: function
- 15. Sự khác biệt giữa std :: regex_match & std :: regex_search?
- 16. Sự khác biệt giữa std :: function <> và một con trỏ hàm tiêu chuẩn?
- 17. sự khác biệt giữa function() {}() và function() {}()
- 18. std :: tr1 :: mem_fn trở lại loại
- 19. Sử dụng lệnh std :: function/mem_fn trong C++ 11 với các hàm thành viên
- 20. Sự khác biệt giữa std :: cout và std :: wcout là gì?
- 21. Trên std :: abs function
- 22. Sự khác nhau giữa & chức năng và function() trong perl
- 23. Sự khác nhau giữa Private Sub, Function và Class
- 24. Sự khác biệt giữa -std = C++ 11 và -std = gnu ++ 11 là gì?
- 25. Sự khác biệt thực tế giữa std :: nth_element và std :: sort là gì?
- 26. Chuyển đổi std :: function <void (Derived *)> thành std :: function <void(Base*)>
- 27. std :: mem_fn với chức năng thành viên ref_qualified
- 28. std :: liên kết với std :: function crashes với Clang
- 29. sự khác biệt giữa $ (document) .ready (function() và $ (function()
- 30. Sự khác nhau giữa notify_all() và notify_one() của std :: condition_variable là gì?
Bạn có nghĩa là 'std :: function' so với kiểu trả về' std :: mem_fn'? So sánh một mẫu lớp với một mẫu hàm không có ý nghĩa gì đối với tôi. – chris