我在計算兩個函數包裝std::function
和std::mem_fn
之間的區別時遇到了困難。從描述來看,在我看來,std :: function可以完成所有的功能std::mem_fn
。在哪個實例中,使用std::mem_fn
而不是std::function
?std :: function和std :: mem_fn有什麼區別
7
A
回答
19
您無法真正比較std::function
與std::mem_fn
。前者是您指定類型的類模板,後者是具有未指定返回類型的函數模板。實際上你並沒有真正考慮過這種情況。
更好的比較可能是mem_fn
和std::bind
之間。在那裏,對於指向成員的指針的具體用例,如果你想要做的是傳遞所有參數,那麼mem_fn
會變得更加冗長。鑑於這種簡單類型:
struct A {
int x;
int getX() { return x; }
int add(int y) { return x+y; }
};
A a{2};
你會如何做一個仿函數只是調用一個給定A
getX()
?
auto get1 = std::mem_fn(&A::getX);
auto get2 = std::bind(&A::getX, _1);
get1(a); // yields 2
get2(a); // same
並且需要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
所以mem_fn
在這種情況下更簡潔。然而,如果我們想結合特定參數,比如調用add(5)
在給定的A
,你只能做與bind
:
auto add_5 = std::bind(&A::add, _1, 5);
add_5(a); // yields 7
最終,function
和mem_fn
之間沒有比較,但有次更喜歡mem_fn
到bind
。
9
由std::mem_fn
返回的包裝非常輕巧;它是一個指向成員的薄包裝器。
std::function
使用類型擦除,這是更重的重量。
相關問題
- 1. std :: invoke和std :: function有什麼區別?
- 2. lambda和std :: function有什麼區別?
- 3. std :: transform和std :: for_each有什麼區別?
- 4. std :: set和std :: vector有什麼區別?
- 5. std :: cout和std :: wcout有什麼區別?
- 6. std :: merge和std :: set_union有什麼區別?
- 7. std :: partial_sum和std :: inclusive_scan有什麼區別?
- 8. std :: mem_fun vs std :: mem_fn
- 9. 「void function()」和「void * function()」有什麼區別?
- 10. 「UTF-16」和「std :: wstring」有什麼區別?
- 11. std :: deque和boost:deque有什麼區別?
- 12. std :: move和unique_ptr :: reset有什麼區別?
- 13. std :: string :: c_str和std :: string :: data有什麼區別?
- 14. C++ std :: lock和std :: unique_lock之間有什麼區別?
- 15. std :: to_string,boost :: to_string和boost :: lexical_cast <std::string>有什麼區別?
- 16. std :: strtol和std :: stoi之間有什麼區別?
- 17. std :: condition_variable和std :: condition_variable_any之間有什麼區別?
- 18. -std = C++ 11和-std = gnu ++ 11之間有什麼區別?
- 19. 瞭解std :: function和std :: bind
- 20. Lambdas和std :: function
- 21. C++中的空std :: shared_ptr與空std :: shared_ptr有什麼區別?
- 22. 什麼是std :: _ Bind <std :: _ Mem_fn <void(ClassName :: *)()>(ClassName *)>是什麼意思? (C++)
- 23. 在std :: function運算符()和std :: forward中發生了什麼?
- 24. 爲什麼這個std :: bind沒有轉換成std :: function?
- 25. boost :: factory和std :: function
- 26. std :: logical_not和std :: not1之間的區別?
- 27. std :: is_integer和std :: is_integral之間的區別?
- 28. std :: regex_match和std :: regex_search之間的區別?
- 29. C++中std :: unique_ptr和std :: shared_ptr的區別
- 30. std :: uninitialized_copy和std :: copy之間的區別?
你的意思是'std :: function'與'std :: mem_fn'的返回類型嗎?比較一個類模板和一個函數模板對我來說沒有多大意義。 – chris