簡體   English   中英

std::function 和 std::mem_fn 有什么區別

[英]What is the difference between std::function and std::mem_fn

我無法弄清楚兩個函數包裝器std::functionstd::mem_fn之間的區別。 從描述來看,在我看來 std::function 可以完成std::mem_fn所做的一切,甚至更多。 在哪種情況下會使用std::mem_fn不是std::function

您無法真正將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};

你將如何制作一個只在給定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 

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

std::mem_fn返回的包裝器非常輕量級; 它是一個圍繞成員指針的薄包裝。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM