2015-05-07 251 views
7

我在計算兩個函數包裝std::functionstd::mem_fn之間的區別時遇到了困難。從描述來看,在我看來,std :: function可以完成所有的功能std::mem_fn。在哪個實例中,使用std::mem_fn而不是std::functionstd :: function和std :: mem_fn有什麼區別

+2

你的意思是'std :: function'與'std :: mem_fn'的返回類型嗎?比較一個類模板和一個函數模板對我來說沒有多大意義。 – chris

回答

19

您無法真正比​​較std::functionstd::mem_fn。前者是您指定類型的類模板,後者是具有未指定返回類型的函數模板。實際上你並沒有真正考慮過這種情況。

更好的比較可能是mem_fnstd::bind之間。在那裏,對於指向成員的指針的具體用例,如果你想要做的是傳遞所有參數,那麼mem_fn會變得更加冗長。鑑於這種簡單類型:

struct A { 
    int x; 
    int getX() { return x; } 
    int add(int y) { return x+y; } 
}; 

A a{2}; 

你會如何做一個仿函數只是調用一個給定AgetX()

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 

最終,functionmem_fn之間沒有比較,但有次更喜歡mem_fnbind

9

std::mem_fn返回的包裝非常輕巧;它是一個指向成員的薄包裝器。

std::function使用類型擦除,這是更重的重量。

相關問題