Varsa, iki türün ortak atalarını (bir veya sıfır temel sınıfla) keşfetmem gereken bir sorunum var. Bu sorunu çözmek için bir tür özellik oluşturmak mümkün mü? kodunda:Derleme zamanında, varsa iki tipte ortak bir miras ağacının kökü nasıl çıkarılır?
template<typename T1, typename T2>
struct closest_common_ancestor
{
typedef XXX type; // what goes here?
};
Verilen aşağıdaki türleri:
struct root {};
struct child1 : root {};
struct child2 : root {};
struct child3 : child2 {};
struct unrelated {};
closest_common_ancestor
aşağıdaki türlerden olmasına neden olur:
closest_common_ancestor<root, child1>::type == root
closest_common_ancestor<child1, child2>::type == root
closest_common_ancestor<child3, child1>::type == root
closest_common_ancestor<child3, child2>::type == child2
closest_common_ancestor<unrelated, child1>::type == error
Ben olmadığını incelemek eğer bu sorunu çözmek inanıyorum tür sıfır veya bir taban sınıfına sahiptir ve eğer öyleyse, bu türün adı. Mümkün mü?
Temel sınıfları denetleyemezsiniz. Sınıflarınızın her birine meta bilgileri manuel olarak eklemediğiniz sürece. –
Doğrudan bir ilişki için zaten mümkün olduğunu unutmayın ('is_base_of' temel C++ 03 blokları açısından uygulanabilir) –
Kök1 've' root2 've' child1 ',' child2' 2 kökü varsa her ikisi de ('struct child1: root1, root2 {};'), 'closest_common_ancestor' için ne döndüğü belirsiz olacaktır. – kennytm