this one gibi SO üzerinde bazı iyi örnekleyiciler buldum ve tüm inandırıcı örnekler, operator()
'u tanımlayan sınıftaki durumu kullanıyor gibi görünüyor.Bu stateless sınıfı bir işlev çağrısı operatörü ile bir c stili işleviyle mi kullanacak?
İşlev çağrısı operatörünü durum bilgisi olmadan tanımlayan bir kitaptaki bir örnekle karşılaştım ve bunu yapamayacağımı düşünüyorum, ancak bunun garip bir kullanım olduğunu ve normal stil işlevi işaretçisinin kullanmaktan daha iyi olacağını operator()
burada her şekilde - daha az kod, daha az değişkenler (karşılaştırıcıları örneklendirmelisiniz), muhtemelen daha verimli olması ve anlam kaybı ya da kapsülleme olmaması (sadece tek bir fonksiyon olduğu için).
Biliyorum std::sort
operator()
sınıfları ve işlevleri arasında seçim yapmanıza izin verir, ancak yukarıdaki mantık nedeniyle işlevleri her zaman kullandım.
Bir sınıfın tercih edilmesinin nedenleri nelerdir? İşte
örnek (aktarılan) var:class Point2D {
//.. accessors, constructors
int x,y;
};
class HorizComp {
public:
bool operator()(const Point2D& p, const Point2D& q) const
{ return p.getX() < q.getX(); }
};
class VertComp {
public:
bool operator()(const Point2D& p, const Point2D& q) const
{ return p.getY() < q.getY(); }
};
template <typename E, typename C>
void printSmaller(const E& p, const E& q, const C& isLess) {
cout << (isLess(p, q) ? p : q) << endl; // print the smaller of p and q
}
//...
// usage in some function:
Point2D p(1.2, 3.2), q(1.5, 9.2);
HorizComp horizComp;
VertComp vorizComp;
printSmaller(p, q, horizComp);
printSmaller(p, q, vorizComp);
Serin:
Bu bize bir
string
adı nesnesi ileequal_range
olabilmesinin önünü:equal_range
çalışmak için yüklem iki farklı karşılaştırma fonksiyonları sahip olması gerekir. Eylemdeki satır içi performansını gösteren bir blog yazısı buldum: http://codeforthought.blogspot.com/2011/07/performance-functors-vs-functions.html –Bunu bir derleyici sorunu olarak gördüğümü itiraf etmeliyim. Inlining ile benzer sorunları gördüm ve derleyici aramaları sonuç olarak sanallaştırmayı başaramadı. Bana öyle görünüyor ki, bu, parıldayan sabit bir yayılmanın başarması gereken bir şeydir (bu durumda, 'less_than'ın tanımı görünür olduğu sürece). –
@MatthieuM .: Kesinlikle bir derleyici sorunudur. Bu yüzden "daha zor", "daha kolay", vb. Terimleri kullandım. Derleyicinin * hem yüklemler için hem de işlevler olarak ayrı ayrı anlık oluşumlar oluşturmayacakları ve hala kendi bedenlerini inline etmelerinin temel bir nedeni yok. Sadece pratik nedenlerden dolayı derleyici uygulayıcıları bu durum için özel bir durum (henüz) yapmış olmayabilir. –