Вы можете использовать std::conditional_t
, чтобы определить тип указателя на член в зависимости от того, предоставлен ли параметр шаблона:
template<class T = struct Default>
struct A {
std::conditional_t<std::is_same_v<T, Default>, A*, T*> t;
int x;
};
, и аналогично вы можете наследовать от соответствующего типа в зависимости от того, является ли параметр шаблона предоставлено:
template<class T = struct Default>
struct B : A<std::conditional_t<std::is_same_v<T, Default>, B<T>, T>> {
int y;
};
Вот демонстрация .