SORU
10 Aralık 2008, ÇARŞAMBA


C Funktorlar ve kullanımları

C funktorlar hakkında çok şey duyuyorum . Biri bana yararlı olacağını ne onlar ne gibi bilgiler verebilir?

CEVAP
10 Aralık 2008, ÇARŞAMBA


Bir functor oldukça operatörü tanımlayan bir sınıf. ""Fonksiyonu: . bak gibi nesneler oluşturmanızı sağlar

// this is a functor
struct add_x {
  add_x(int x) : x(x) {}
  int operator()(int y) const { return x   y; }

private:
  int x;
};

// Now you can use it like this:
add_x add42(42); // create an instance of the functor class
int i = add42(8); // and "call" it
assert(i == 50); // and it added 42 to its argument

std::vector<int> in; // assume this contains a bunch of values)
std::vector<int> out(in.size());
// Pass a functor to std::transform, which calls the functor on every element 
// in the input sequence, and stores the result to the output sequence
std::transform(in.begin(), in.end(), out.begin(), add_x(1)); 
assert(out[i] == in[i]   1); // for all i

Funktorlar hakkında güzel şeyler bir çift vardır. Düzenli fonksiyonları aksine, devlet içerebilir. Yukarıdaki örnek her ne verirsin 42 ekleyen bir fonksiyon oluşturur. Ama değer 42 kodlanmış değil, functor bizim örneğini oluşturduğumuz zaman yapıcı bir argüman olarak belirtilen oldu. Sadece farklı bir değerle kurucuyu çağırarak 27, eklenen bir başka toplayıcı, yaratabilirim. Bu kibarca özelleştirilebilir hale getirir.

Son satırlarını göstermek için, sık sık std gibi diğer işlevler için bağımsız değişkenler olarak funktorlar pass::dönüşüm veya diğer standart kütüphane algoritmaları. Ne kadar aynı bir normal işlev işaretçisi dışında, dediğim gibi yukarıda, funktorlar olabilir "özel" çünkü içerdikleri durumu, yapım onları daha esnek (Eğer istediğim bir işlev işaretçisi, zorunda mıyım yazmak bir işlevi eklendi tam olarak 1 argüman. Eşleme ile başlatılmış olursa olsun genel ve ekler), ve aynı zamanda potansiyel olarak daha verimli. Yukarıdaki örnekte, derleyici tam olarak std::transform araması gerektiğini bilir. add_x::operator() Ara. Bu işlev çağrısı satır içi anlamına gelir. Ve eğer el ile vektör her değeri işlevi arasaydım olarak daha verimli hale getirir.

Eğer vardı geçti bir işlev işaretçisi yerine, derleyici olamaz hemen bakın hangi fonksiyon puan, bu yüzden sürece gerçekleştirdiği bazı oldukça karmaşık genel en iyi duruma getirme, bunu yapmak zorunda kalırdı inceleyebilirsiniz işaretçiyi çalışma zamanı, ve sonra, kararını ver.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Android Developers

    Android Deve

    9 Kasım 2007
  • erikbjgn's channel

    erikbjgn's c

    12 Mayıs 2008
  • Justin Davis

    Justin Davis

    14 Ocak 2008