Tôi có một vấn đề mà tôi cần phải khám phá tổ tiên chung của hai loại (với một hoặc không có lớp cơ sở) nếu nó tồn tại. Có thể xây dựng đặc điểm kiểu để giải quyết vấn đề này không? Trong mã:Làm thế nào để suy ra, tại thời gian biên dịch, gốc của một cây thừa kế chung với hai loại nếu một tồn tại?
template<typename T1, typename T2>
struct closest_common_ancestor
{
typedef XXX type; // what goes here?
};
Với các loại sau đây:
struct root {};
struct child1 : root {};
struct child2 : root {};
struct child3 : child2 {};
struct unrelated {};
closest_common_ancestor
sẽ cho kết quả trong các loại sau đây:
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
Tôi tin rằng tôi có thể giải quyết vấn đề này nếu tôi có thể kiểm tra liệu một loại có 0 hoặc một lớp cơ sở, và nếu như vậy, tên của loại đó. Điều này có thể không?
Bạn không thể kiểm tra các lớp cơ sở. Không, trừ khi bạn thêm thông tin meta vào từng lớp của bạn theo cách thủ công. –
Lưu ý rằng đối với một mối quan hệ trực tiếp nó đã có thể ('is_base_of' có thể được thực hiện theo khối C++ 03 cơ bản) –
Nếu có 2 gốc' root1' và 'root2', và' child1', 'child2' kế thừa cả hai ('struct child1: root1, root2 {};'), nó sẽ không rõ ràng cho 'closest_common_ancestor' những gì cần trả về. – kennytm