SORU
7 Mart 2013, PERŞEMBE


Std::kullanarak üye işlevi ile bağlamak, ya da bu bağımsız değişken için işaretçi nesne kullanmak?

Bağlamak için std::bind üye fonksiyonu kullanılırken, ilk bağımsız değişken nesneleri this işaretçi. Her iki nesnenin geçici bir işaretçi olarak çalışır ve ancak.

Örneğin bakın şu programı:

#include <iostream>
#include <functional>

struct foo
{
    void bar(int v) { std::cout << "foo::bar - " << v << '\n'; }
};

int main()
{
    foo my_foo;

    auto f1 = std::bind(&foo::bar, my_foo, 1);
    auto f2 = std::bind(&foo::bar, &my_foo, 2);

    f1();
    f2();
}

Hem çınlama ve GCC şikayet olmadan bu derler ve sonuç Her iki bağlar için çalışır:

foo::bar - 1
foo::bar - 2

Belirtimi (bölüm 20.8.9) kafamda bir yere oturtmaya çalışıyorum ama uzak bana bu yerlerden biri.

Bir doğru olması gerekir, ya da her ikisi de doğru mu?

CEVAP
7 Mart 2013, PERŞEMBE


Her ikisi de doğru. 20.8.9.1.2 iletir gereksinimleri tanımlamak için 20.8.2 ve bind aramanız etkisi. 20.8.2

20.8.2 Gereksinimleri [işlev.gerektirir]

1TanımlayınÇAĞIRMAKŞöyle: (f, t1, t2, ..., tN)

(t1.*f)(t2, ..., tN) f bir işaretçi bir üye işlevi bir sınıf T t1 bir nesnenin türü T ya da başvuru için bir nesnenin türü T veya bir başvuru için bir nesne, bir tür türetilmiş T;

f bir sınıfın bir üye işlev işaretçisi — ((*t1).*f)(t2, ..., tN) T t1 türleri önceki öğe ile tarif değil;

t1.*f N == 1 f bir işaretçi üye veri bir sınıf T t1 bir nesnenin türü T veya bir başvuru için bir nesnenin türü T veya bir başvuru için bir nesne, bir tür türetilmiş T;

(*t1).*f N == 1 f bir işaretçi üye veri sınıfı T t1 değil bir tür tarif önceki öğe;

Diğer tüm durumlarda — f(t1, t2, ..., tN).

İlk iki seçenek bir referans ve bir işaretçi hem izin ver.

Burada dikkat etmeniz gereken en önemli şey ifade ediyordeğilnormal işaretçiler ile sınırlama. Alabilirsin diye std::shared_ptr veya başka bir akıllı işaretçi tutmaya örneği hayattayken bağlı ve hala iş ile std::bind t1 başvuru yapıldı, ne olursa olsun (verilen, tabii ki, bu mümkün).

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eddie Bravo

    Eddie Bravo

    17 EKİM 2006
  • TheDigiCraft

    TheDigiCraft

    25 NİSAN 2011
  • FusioNGamiing

    FusioNGamiin

    10 Temmuz 2007