SORU
5 Mart 2012, PAZARTESİ


C bir temsilci nedir?

C bir temsilci, genel fikir nedir ? Ne olduklarını, nasıl kullanılır ve ne için kullanılır?

Önce onlar hakkında bir bilgi edinmek için 'kara kutu' yol, ama bu işler cesaret hakkında biraz bilgi de harika olurdu.

Bu saf veya temiz C değil, ama çalıştığım yerde bulunanla bolca olduğunu fark ettim. Onları anlamak için yeterli diye umuyorum, sadece bunları kullanmak ve korkunç iç içe şablon korkunçluk sinemayla değil.

The Code Project bu iki madde ne demek istediğimi ama özellikle kısaca açıklayın:

CEVAP
5 Mart 2012, PAZARTESİ


C delege elde etmek için seçenekler inanılmaz bir dizi var . İşte benim aklıma gelenler.


Seçenek 1 : funktorlar:

İşlev bir nesne operator() Uygulama tarafından oluşturulmuş olabilir

struct Functor
{
     // Normal class/struct members

     int operator()(double d) // Arbitrary return types and parameter list
     {
          return (int) d   1;
     }
};

// Use:
Functor f;
int i = f(3.14);

Seçenek 2: deyimler (C 11) lambda

// Syntax is roughly: [capture](parameter list) -> return type {block}
// Some shortcuts exist
auto func = [](int i) -> double { return 2*i/1.15; };
double d = func(1);

Seçenek 3: İş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şlev işaretçisi(hızlı çözüm)

BakınFast C Delegate(The Code Project).

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 işlevi

(veya standart kütüphane desteği yok olsaydı zaten 12**). Yavaş, ama en esnek.

#include <functional>
std::function<int(double)> f = [can be set to about anything in this answer]
// Usually more useful as a parameter to another functions

Seçenek 6: bağlama

Önceden bazı parametreleri ayarı, örneğin bir üye işlev çağrısı için uygun sağlar.

struct MyClass
{
    int DoStuff(double d); // actually a DoStuff(MyClass* this, double d)
};

std::function<int(double d)> f = std::bind(&MyClass::DoStuff, this, std::placeholders::_1);
// auto f = std::bind(...); in C  11

Seçenek 7: şablonlar

Hiçbir bağımsız değişken listesi eşleştiği sürece kabul.

template <class FunctionT>
int DoSomething(FunctionT func)
{
    return func(3.14);
}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Art Food Kitty - Kelly Eddington

    Art Food Kit

    7 Kasım 2006
  • iNCH

    iNCH

    20 Temmuz 2009
  • TimMinchinLive

    TimMinchinLi

    23 ŞUBAT 2009