2016-03-22 10 views
1

Bu soruya verilen yanıtı okuyarak (Casting a function pointer to another type), gibi işaretçilerin void(*)(B*) gibi işaretçilere gösterilmesinin güvenli olduğunu anlıyorum, bunları çağırmadan önce onları geri göndermeniz yeterlidir.Bir üye fonksiyon işaretçisini başka bir sınıfa çevirmek ve tekrar geri vermek güvenli midir?

Bu, üye işlev işaretçileri için de çalışır mı? void(B::*)()'a void(A::*)() güvenli bir şekilde döküm yapabilir ve onu aramadan önce geri gönderebilir miyim? sistemimde en azından iş gibi görünüyor

örnek kod:

#include <iostream> 

struct A { 
    void f() { std::cout << "called" << std::endl; } 
}; 

struct B {}; 

int main() { 
    A instance; 
    auto ptr = reinterpret_cast<void (B::*)()>(&A::f); 
    (instance.*(reinterpret_cast<void (A::*)()>(ptr)))(); 
} 

cevap

3

5.2.10/10 (reinterpret_cast) itibaren bilgi:

“tipi T1 X'in elemanına pointer” tipte bir prvalue açıkça farklı bir tipte bir prvalue dönüştürülebilir olabilir “işaretçi T1 ve T2'nin her ikisi de işlev türleri veya her ikisi de nesne türleri ise ya da üyesine T2 "tipi için. 7 null üye işaretçi değeri (4.11), hedef türünün null üye işaretçisi değeri olan 'a dönüştürülür. Bu dönüşümün sonucu, aşağıdaki durumlar hariç, tanımlanmamış olan:

  • verir orijinal tip geri elemanı işlevi türüne farklı işaretçi “üye fonksiyonuna işaretçi” tipi bir prvalue dönüştürme ve Üye değerine özgün işaretçi.tamamen yasal gibi ve pointer-to-üye fonksiyonu (işlevlerine yönelik her iki noktadan) yayın yapıyorsanız Bu durumda

, bu yüzden görünüyor.

3

, evet inanıyorum. Burada standart (5.2.10) 'de bulmak budur:

“tipi T1 X üyesine pointer” türünde bir prvalue açıkça elemanından farklı bir türü “göstericinin bir prvalue dönüştürülebilir olabilir T1 ve T2'nin her ikisi de fonksiyon tipi veya her ikisi de nesne tipi ise, T2 tipinin Y değeri. Boş üye işaretçi değeri (4.11), hedef türünün boş üye işaretçi değeri olan 'a dönüştürülür. Bu dönüşümün sonucu, aşağıdaki durumlar hariç, tanımlanmamış olan:

- orijinal tip geri elemanı işlevi türüne farklı işaretçi “üye fonksiyonuna işaretçi” tipi bir prvalue dönüştürme ve verimleri Üye değerine özgün işaretçi.

- T2 hizalanması şartlar daha bir katı olan (“tipi T2 Y veri elemanına pointer” tip için “tip T1 X'in veri elemanına pointer” tipte bir prvalue dönüştürülmesi T1) ve orijinal tipine geri orijinal işaretçi üye değerine verir.

-1

5,4 [expr.cast] dönüştürmek reinterpret_cast kullanabilir belirten bir işaretçi-üyesinin-of-türetilmiş bir işaretçi-üyesinin-of-baz ve geri. Tabii ki, işaretçiyi kullanmak için türetilmiş türe geri dönmeniz gerekir, çünkü işaret ettiği işlevin aslında tabanın bir üyesi olduğunu garanti etmez.

+0

Alakasız, soru türetilmiş sınıf hakkında değil. – SergeyA

+0

@SergeyA - iç çekiş. Bu ** oyuncular hakkında ** ve bu yasal oyunculardan biri. –

+0

Bu, ama soruya hiçbir şekilde cevap vermiyor. Mine ve Mark'ın cevapları var. – SergeyA

İlgili konular