Trong một mẫu, tôi muốn xem chi tiết tham số mẫu đối với loại không được tạo kiểu thực. Vì vậy:Các đặc điểm kiểu C++ để trích xuất lớp tham số mẫu
template <typename T>
struct MyTemplate
{
// sadly there's no extract_Base
typedef typename extract_base<T>::MyType WorkType;
};
struct X {};
template <typename T> struct Templ {};
//MyTemplate<Templ<X>>::WorkType is X;
//MyTemplate<X>::WorkType is X;
Giải pháp duy nhất tôi thấy là để xác định loại cơ sở thực như std :: vector <X> :: value_type là X. Nhưng tôi tò mò nếu có một cách để làm điều này mà không cần xác định các loại phụ trợ bên trong mỗi mẫu đích.
Tôi thấy thứ gì đó như http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2965.html nhưng đây là bản nháp? và tôi không hiểu lắm.
Có tôi biết có nhiều thừa kế, nhưng ngay cả đối với trường hợp đơn giản, điều này sẽ rất tuyệt.
CẬP NHẬT: Giải pháp Nawaz phù hợp với tôi rất tốt và dễ dàng mở rộng đến các trường hợp cụ thể, ví dụ:
template<template<typename, typename> class X, typename T1, typename T2>
struct extract_base <X<T1, T2>> //specialization
{
typedef T1 base;
};
Tôi thậm chí có thể áp dụng is_base_of hoặc các bộ lọc khác cho T1/T2 v.v. Vì vậy, nó không hoạt động cho X < T, U > - ít nhất với g ++ 4.6.7.
Điều này không liên quan gì đến lớp thừa kế hoặc cơ sở. –
Có 'std :: is_base_of' nhưng có thể không phù hợp với mục đích của bạn. – dirkgently