C ++ 'da delege elde etmek için inanılmaz sayıda seçeneğiniz var. İşte aklıma gelenler.
Seçenek 1: işlevler:
Uygulanarak bir işlev nesnesi oluşturulabilir operator()
struct Functor
{
int operator()(double d)
{
return (int) d + 1;
}
};
Functor f;
int i = f(3.14);
Seçenek 2: lambda ifadeleri ( yalnızca C ++ 11 )
auto func = [](int i) -> double { return 2*i/1.15; };
double d = func(1);
Seçenek 3: işlev işaretçileri
int f(double d) { ... }
typedef int (*MyFuncT) (double d);
MyFuncT fp = &f;
int a = fp(3.14);
Seçenek 4: Üye işlevlere işaretçi (en hızlı çözüm)
Bkz. Hızlı C ++ Temsilcisi ( Kod Projesinde ).
struct DelegateList
{
int f1(double d) { }
int f2(double d) { }
};
typedef int (DelegateList::* DelegateType)(double d);
DelegateType d = &DelegateList::f1;
DelegateList list;
int a = (list.*d)(3.14);
Seçenek 5: std :: function
(veya boost::function
standart kitaplığınız desteklemiyorsa). Daha yavaştır, ancak en esnek olanıdır.
#include <functional>
std::function<int(double)> f = [can be set to about anything in this answer]
Seçenek 6: bağlama ( std :: bind kullanarak )
Bazı parametreleri önceden ayarlamaya izin verir, örneğin bir üye işlevini çağırmak için uygundur.
struct MyClass
{
int DoStuff(double d);
};
std::function<int(double d)> f = std::bind(&MyClass::DoStuff, this, std::placeholders::_1);
Seçenek 7: şablonlar
Bağımsız değişken listesiyle eşleştiği sürece her şeyi kabul edin.
template <class FunctionT>
int DoSomething(FunctionT func)
{
return func(3.14);
}