Uzun zaman önce bir referans statik döküm İşaretli ama tip I olmasını farz ne değildir: istediğimBir static_cast gerçekleştirmek zaman ben bir assert olsun ki ben şu şablonu oluşturduk
/// perform a static_cast asserted by a dynamic_cast
template <class Type, class SourceType>
Type static_cast_checked(SourceType item)
{
Assert(!item || dynamic_cast<Type>(item));
return static_cast<Type>(item);
}
Bugün
/// overload for reference
template <class Type, class SourceType>
Type &static_cast_checked(SourceType &item)
{
Assert(dynamic_cast<Type *>(&item));
return static_cast<Type>(item);
}
ancak derleyici başka referans bir başvuru döküm ediyorum bu aşırı kullanmak görünmüyor: yanı işaretçiler ile ancak referanslarla sadece çalışacak bir varyantı oluşturmak için. Korkarım ki nedenini anlamak ya da çalışan bir varyant yaratabilmek için şablon çözünürlük kurallarını anlamıyorum.
Not: Bu proje için istisnalar devre dışı bırakıldığı için dynamic_cast<Type *>
NULL yerine bad_cast exception
'u yakalayamıyorum.
Eğer 'SourceType *' için bir aşırı ekleyebilir ve özgün bir emekli miyim? Değer türlerini desteklemeniz gerekiyor mu? (Ve bu sorunu çözüyor mu, şimdi merak ediyorum?) –
Bu kod satırlarını düşündüm ve neden gerekli olduğunu anlayamıyorum. Dinamik bir döküm ile statik bir döküm olup olmadığını kontrol ederseniz, sadece nesneler dinamik dökümlü statik döküm ile kontrol edilebilir. Bu, "dynamic_cast" in yeniden yapılandırılmasıdır. Dinamik ve statik cast ist arasındaki fark, dinamik kalıba vtable ve statik olmayanı araştırır. – nutario
Statik bir dökümdür, ancak bir tanesi - yani, hata ayıkladığınızı bildirir. Bu, döküm yaptığınız türle ilgili varsayımınızın yanlış olduğunu bildirir. – Suma