![](/img/trans.png)
[英]What is the std::mem_fn type equivalent to void(MainWindow::*handler)()?
[英]What is the difference between std::function and std::mem_fn
我無法弄清楚兩個函數包裝器std::function
和std::mem_fn
之間的區別。 從描述來看,在我看來 std::function 可以完成std::mem_fn
所做的一切,甚至更多。 在哪種情況下會使用std::mem_fn
不是std::function
?
您無法真正將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
更簡潔。 然而,如果我們想綁定一個特定的參數,比如在給定的A
上調用add(5)
,你只能使用bind
來做到這一點:
auto add_5 = std::bind(&A::add, _1, 5);
add_5(a); // yields 7
最終, function
和mem_fn
之間沒有比較,但有時更喜歡mem_fn
到bind
。
std::mem_fn
返回的包裝器非常輕量級; 它是一個圍繞成員指針的薄包裝。
std::function
使用類型擦除,這是更重量級的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.