Nếu bạn sử dụng std::conditional
thay vì if_
lớp mẫu như thực hiện bởi @Matthieu trong câu trả lời của mình, sau đó giải pháp của bạn sẽ làm giảm thế này:
template <typename T, typename U>
struct select_base
{
typedef typename std::conditional<std::is_base_of<T, Base>::value, T, U>::type base_type;
};
Hoặc đơn giản này:
template <typename T, typename U>
struct select_base : std::conditional<std::is_base_of<T, Base>::value, T, U> {};
trông thậm chí còn tốt hơn.
Sự khác biệt giữa hai giải pháp này là trong dung dịch đầu tiên bạn đưa ra một lập trình thân thiện với tên cho loại lồng nhau, như tôi đã cho nó base_type
, trong khi ở các giải pháp thứ hai loại lồng nhau chỉ là type
mà trông không thân thiện với lập trình viên.
Lưu ý rằng trong cả hai trong những giải pháp trên, bạn đã sử dụng các loại lồng nhau là một trong hai select_base<T,U>::base_type
(trong dung dịch đầu tiên) hoặc select_base<T,U>::type
(trong dung dịch thứ hai — và vì lý do đó, nếu bạn đã sử dụng typename
như bạn đã viết cho mình trong câu hỏi bản thân
Tuy nhiên, nếu bạn thay sử dụng mẫu bí danh, định nghĩa là:.
template<typename T, typename U>
using base_type = typename std::conditional<std::is_base_of<T, Base>::value, T, U>::type;
sau đó bạn có thể sử dụng base_type<T,U>
mà không lồng nhau-type và typename
as:
template <typename T1, typename T2>
struct test
{
//typename select_base<T1, T2>::type m_ValueOfBaseType; //ugly!
base_type<T1, T2> m_ValueOfBaseType; //better
};
Hy vọng điều đó sẽ hữu ích.
Câu hỏi của bạn là gì? – Nawaz
Câu hỏi của bạn không rõ ràng. Bạn muốn chọn loại cơ sở trong hai loại 'T1' hoặc' T2', ví dụ: nếu 'T1' xuất phát từ' T2', thì kiểu đầu ra phải là 'T2'. Hoặc bạn muốn chọn loại xuất phát từ loại thứ ba, nói 'cơ sở'? – Nawaz
@Nawaz: từ ideone được liên kết, tôi sẽ nói 'Base' là cố định và anh ta muốn chọn bất kỳ' T1' hoặc 'T2' nào xuất phát từ nó. –