2015-05-07 37 views
7

arasındaki fark nedir? İki işlev sarmalayıcısı std::function ve std::mem_fn arasındaki farkı belirlerken sorun yaşıyorum. Açıklamadan, bana öyle görünüyor ki, std :: işlevi her şey std::mem_fn yapar ve daha fazlasını yapar. Hangi örnektestd::function üzerinden?std :: function ve std :: mem_fn

+2

Yani std :: mem_fn' std :: function' vs dönüş türünü mi kastediyorsunuz? Bir sınıf şablonunu bir işlev şablonuyla karşılaştırmak bana mantıklı gelmiyor. – chris

cevap

19

std::mem_fn ile std::function gerçekten karşılaştıramazsınız. İlki, belirttiğiniz türü olan bir sınıf şablonudır ve ikincisi, belirtilmemiş dönüş türüne sahip bir işlev şablonudır. Gerçekten, birini diğerine karşı düşünebileceğin bir durum yok.

mem_fn ve std::bind arasında daha iyi bir karşılaştırma olabilir. Orada, bir işaretçi-üyesi için belirli bir kullanım durumu için, yapmak istediğiniz tek şey tüm bağımsız değişkenleri geçmek ise, mem_fn çok daha az ayrıntılı hale getiriyor. Bu basit tür Verilen:

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

A a{2}; 

Nasıl öylece verilen bir A üzerinde getX() çağıran bir functor yapacak?

auto get1 = std::mem_fn(&A::getX); 
auto get2 = std::bind(&A::getX, _1); 

get1(a); // yields 2 
get2(a); // same 

add için ek bir argüman alır?

auto add1 = std::mem_fn(&A::add); 
auto add2 = std::bind(&A::add, _1, _2); 

add1(a, 5); // yields 7 
add2(a, 5); // same 

Yani mem_fn bu durumda yılında daha özlü.

auto add_5 = std::bind(&A::add, _1, 5); 
add_5(a); // yields 7 
Sonuçta

, function ve mem_fn arasında hiçbir karşılaştırma, ancak zamanlar vardır mem_fn tercih: bind ile biz belirli bir argüman bağlamak isteniyorsa, bu durumda, diyelim belirli bir A üzerinde add(5) diyoruz, yalnızca yapabilir bind.

9

std::mem_fn tarafından döndürülen sarıcı son derece hafiftir; üye için bir işaretçi etrafında ince bir sarıcı var.

std::function çok daha ağır olan tür silme kullanır.

İlgili konular