herkes accepted answer sadece önemsiz vakalarla çalıştığını fark etti mi? <> :: target() işlevinin tek yolu, C geri çağırma ile ilişkilendirilebilecek bir nesneyi döndürür; bu, C geri çağırma ile ilişkilendirilebilecek bir nesne ile yapılmışsa. Eğer durum buysa, o zaman doğrudan bağlanmış ve <> ile başlayan tüm işlevlerini atlamış olabilirsiniz.
Bunu düşünüyorsanız, bunun için sihirli bir çözüm yoktur. C stili bir geri arama, yürütülebilir koda işaret eden tek bir işaretçi olarak saklanır. Herhangi bir belirgin destek :: function <> en az iki işaretçiye ihtiyaç duyacaktır: biri çalıştırılabilir koda, diğeri de çağrıyı kurmak için gereken verilere (örneğin, 'bu' işaretçisine, bir üye üye durumunda fonksiyonu).
Yükseltme işlevini kullanmanın en doğru yolu :: function and boost :: C callbacks ile bağlama, geri arama imzasını karşılayan bir shim işlevi oluşturmaktır, hangi fonksiyonun çağrılacağını <> ve çağırır. Genellikle C geri çağrıları 'kullanıcı verileri' için bir çeşit boşluğa * sahip olacaktır; Eğer fonksiyon işaretçisi saklamak orası: Elbette
typedef void (*CallbackType)(int x, void* user_data);
void RegisterCallback(CallbackType cb, void* user_data);
void MyCallback(int x, void* userData) {
boost::function<void(int)> pfn = static_cast<boost::function<void(int)> >(userData);
pfn(x);
}
boost::function<void(int)> fn = boost::bind(myFunction(5));
RegisterCallback(MyCallback, &fn);
geri arama imza kullanıcı veri işaretçisi çeşit içermiyorsa,, şans bitti. Ancak, bir kullanıcı veri işaretçisi içermeyen herhangi bir geri arama, çoğu gerçek dünya senaryosunda halihazırda kullanılamaz durumda ve yeniden yazılması gerekiyor.
'boost :: function pfn = static_cast > (userData) '' boost :: function * kullanmalı mı yoksa derleme hatası mı olacak? –
Gohan
@Gohan evet, yazarın amacı buydu. – Yann