Nesnenin oluşturulmasını yöneten World
sınıfım var ... Oluşturulduktan sonra afterCreation
yöntemini çağırdım ve oluşturulan nesne Kullanıcıdan türetilmiş kullanıcı tanımlı tiptir (ör. MyEntity
), addEntity
'u aramak istiyorum. Nesne başka bir şeydi, hiçbir şey yapmak istemiyorum. o vb her türetilmiş sınıf İşteBelirli türden türetilen tür için şablon nasıl uzmanlaşır?
için benzersiz kimlikler oluşturur çünkü addEntity
uygun T
çağrılmalıdır benim çözümdür:
template <int v>
struct ToType
{
enum { value = v };
};
template <typename T>
void World::afterCreation(T * t)
{
afterCreation(t, ToType<std::is_base_of<Entity, T>::value>());
}
template <typename T>
void World::afterCreation(T * t, ToType<true>)
{
addEntity(t); //here I cant pass Entity *, I need the real type, eg. MyEntity
}
template <typename T>
void World::afterCreation(T * t, ToType<false>)
{
}
Benim soru - daha iyi bir yol yapılabilir mi?
Aşağıdaki kodu ToType
veya benzeri olmadan nasıl simüle edebilirim?
template <typename T>
void afterCreation(){/*generic impl*/}
template <typename T where T is derived from Entity>
void afterCreation(){/*some specific stuff*/}
- başlığında niyetimi açıklamak için sadece "uzman", Sen polimorfik işaretçiler ile yapabilirsiniz
Eddie Edwards: Sadece üzerinde çalışmasını istediğiniz nesnenin işaretçisini geçirerek. Varlık x; AfterCreation (&x);1. – orlp
+1, basit ve noktaya :) Sorunun ne olduğunu sormak yerine asıl sorunu çözer (SFINAE'den çok daha basit bir yaklaşımla) - fonksiyonda hiçbir şeyin sadece "derleyeceğini" varsayıyorum Varlık türetilmiş türler, yani varlık türü türetilmiş türler için derleme yapamayacak "varlık -> getEntityName()" gibi bir şey yoktur) –
Üzgünüz gece bekçisi yorumlarımı destekledim (ve yanıtlanmamış yanıtınıza uyguladılar) derleyicinin çoğu, x türüyle ilgili tam bilgiye sahip olduğu için dynamic_cast öğesini kaldıracaktır. Ya da en azından, tempile edilmiş çözümün işe yarayabileceğini varsayarak, ihtiyaç duyduğu kadar bilgi. –