Bagaimana cara menguji waktu casting?

Dalam sebuah tugas, saya diminta untuk membuat static_cast dan Dynamic_cast sendiri menggunakan spesialisasi template. Bagaimana cara menguji apakah pemeran statis saya benar-benar selesai pada waktu kompilasi dan pemeran dinamis pada waktu proses?

template<typename Dst, typename Src>
static Dst my_static_cast(Src src);

template<typename Dst, typename Src>
static Dst my_dynamic_cast(Src src);

person Amit Ohayon    schedule 25.06.2015    source sumber
comment
Periksa kode mesin yang dihasilkan?   -  person Kerrek SB    schedule 25.06.2015
comment
Saya rasa, sedikit kode akan membantu.   -  person Daniel Jour    schedule 25.06.2015
comment
Untuk cast dinamis, Anda dapat membuktikannya dengan menulis kode yang dapat dikompilasi dengan baik, tetapi error pada saat run-time. (misalnya untuk tipe pointer, Dynamic_cast mengembalikan NULL jika tidak kompatibel)   -  person Adam Finley    schedule 25.06.2015
comment
@DanielJour menambahkan tanda tangan fungsi, untuk apa nilainya... implementasinya sendiri buruk, dan saya tidak ingin jawaban spesifik untuk kode saya, tetapi secara umum bagaimana cara memeriksa waktu casting.   -  person Amit Ohayon    schedule 25.06.2015


Jawaban (1)


Bukan jawaban lengkap tapi pertimbangkan ini:

class D
{
public:
    virtual ~D(){}
};
class A : public D{};

class B{};

Sekarang dynamic_cast<B*>(new A()) mengkompilasi OK (dan mengembalikan 0) tetapi static_cast<B*>(new A()) menghasilkan kesalahan kompilasi. Saya hampir yakin Anda dapat melakukan SFINAE ini untuk membuat tes yang sesuai.

Tentu saja, pengujian ini mengasumsikan Anda hanya perlu membedakan antara static_cast yang 100% memenuhi standar dan 100% dinamis_cast yang memenuhi standar. Untuk mendeteksi bug dalam implementasi Anda, diperlukan pengujian tambahan.

EDIT: Anda tidak dapat mengujinya sepenuhnya secara otomatis. Pemeran memerlukan argumen runtime sehingga tidak dapat diuji pada waktu kompilasi. Dan, pada saat runtime, satu-satunya perbedaan antara penghitungan waktu kompilasi dan penghitungan waktu proses adalah kinerja. Saya tidak akan merekomendasikan pengujian dengan "yah, runtime cast tidak bisa secepat itu". Itu tidak bisa diandalkan.

person matb    schedule 25.06.2015