2013-05-13 47 views
5

kullanarak üye işlevine işaretçiler Bunun zaten tartışılan uzun bir konu olduğunu biliyorum, ancak henüz tatmin edici bir yanıt bulamadım.C++ 11: std :: function :: target()

kısacası Soru: Hatta() yetenekleri, c tarzı yöntemlerine üye işlev işaretçileri geçmek değil mümkündür C++ 11 fonksiyonu :: hedefini kullanarak? 0 döndürür) (mbf.target için çağırma ve böylece segfault üretilir:

Aşağıdaki kod çalışmaz. Ve neden anlamıyorum, çünkü üye işlevini genel bir işlev nesnesine bağlarım, dolayısıyla türün iyi olması gerekir. Ben yanlış yapıyorum yoksa imkansız bir şey yapmak çalışıyorum ne

?

#include <functional> 
using namespace std; 

typedef void (*CBType)(int, int); 
CBType myCB = 0; 

void regCallback(CBType cb) 
{ 
    myCB = cb; 
} 

class A 
{ 
public: 
    void memberCB(int a, int b) {} 

    void registerCallback() 
    { 
     auto mbMem = mem_fn(&A::memberCB); 
     function<void(int,int)> mbf = 
      bind(mbMem, *this, placeholders::_1, placeholders::_2); 
     regCallback(*mbf.target<void(*)(int,int)>()); 
    } 
}; 


int main() 
{ 
    A inst; 
    inst.registerCallback(); 
} 
+2

. Bence orada berbatsın. '& A :: memberCB' türünün geçersiz olduğunu (A :: *) (int, int) ve boş değil (*) (int, int) 'olduğunu unutmayın. Kodunuz derlenmiyor, derleme kodu verebilir misiniz? – iammilind

+0

Doğru, başlık dosyasını ve ad alanını ekledim. Sonra g ++ ve derleyici bayrağı "-std = C++ 0x" – bobbel

+2

Impossible kullanarak derler. 'target', daha önce orada sakladığınız bir işlev işaretçisini almak içindir. Hiçbir büyü yapmaz ve altın üretemez. Burada 'hedef' hakkında unutabilirsiniz; tamamen farklı (ve oldukça nadir) kullanım durumları vardır. –

cevap

3

Kişisel üye işlev değil tip void (A::*)(int, int) taşımaktadır tip void (*)(int, int) taşımaktadır. Bu nedenle, target, yanlış türde yazmaya çalıştığınız için nullptr değerini döndürür. CBType'un std::function<void(int, int)> yapmasını öneriyorum. Ve `Typedef boşluk (A :: * CBType) (int, int;);` Typedef boşluk (* CBType) (int, int) 'arasındaki bir fark vardır

+0

Bu ilginç. Yani "function mbf = ..." ifadesi hala bir şekilde sınıfa dahili bir referansı tutacak ve üye olmayan işaretçiye türünü belirleyemiyor? – bobbel

+0

Teknik olarak mümkün olsa bile, doğru olamaz. Sınıf işlevinin işlevselliği, bağlı olduğu nesneye bağlıdır, içeriğinin bir parçasıdır. – SomeWittyUsername

+0

Evet, tabiki. Ama bu yüzden nesneyi işleve bağlamak istiyorum. Ama std :: function'un yeteneklerinin çok üst düzey bir görünümü var gibi görünüyor. – bobbel