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
cevap
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
.
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.
- 1. C++ 11: std :: function :: target()
- 2. G ++, clang ++ ve std :: function
- 3. Captureless lambda, std :: function
- 4. std :: function ile geri aramalar
- 5. std :: fonksiyonu ve std :: bağlama davranışı
- 6. `std :: function` argümanlarının sayısı nasıl alınır?
- 7. GCC hatası veya değil: default std :: function?
- 8. Neden boost :: function std :: list dosyasında saklamıyorum?
- 9. std :: function oluştururken libstdC++ ve libC++ arasındaki farklı davranış
- 10. std :: vector ve std :: dk davranış
- 11. Karıştırma std :: hareket() ve std :: iplik
- 12. std :: thread nasıl sonlandırılır?
- 13. Dönen std :: hareket (f) in std :: for_each
- 14. std :: chrono ve cout
- 15. std :: scoped_allocator_adaptor ve
- 16. Eigen ve std :: vector
- 17. std :: shared_ptr ve Kalıtım
- 18. hata std Std :: dizi başlatmasını :: dizi :: boyutu
- 19. std :: unique_ptr parametresi olarak std :: thread
- 20. C++ 'da std :: function imzası üzerine aşırı yüklenme nasıl yapılır?
- 21. Anonim işlev nesnesini std :: function öğesine geçirin mi?
- 22. C++ ile strateji kalıbını std :: function ile nasıl uygulanır
- 23. Neden std :: function işlev_türü veya eşdeğer üye türüne sahip değil?
- 24. C++ 11 std :: hash function nesne sınıfları thread safety
- 25. Std :: function by-value veya (rvalue) -reference ile mi geçmeliyim?
- 26. std :: not1 ve std :: not2'yi nasıl kullanırsınız?
- 27. SFINAE std :: isfinite ve std :: is_arithmetic kullanarak benzer işlevler
- 28. -std = C++ 11 ve -std = gnu ++ 11 arasındaki farklar nelerdir?
- 29. N2965 - std :: base ve std :: direct_bases'ın durumu nedir?
- 30. std :: cout ve std :: wcout arasındaki fark nedir?
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