В таком типе, как неспециализированная структура шаблона pointer_traits
(т. е. template <class Ptr> struct pointer_traits
), существует шаблон псевдонима-члена rebind
, который определяется как Ptr::rebind<U>
, если он существует, или какой-либо другой тип в противном случае. Хотя я видел несколько ответов на проверку существования определенного члена, как реализовать шаблон "условного" псевдонима, такой как pointer_traits::rebind
? То есть как бы следующим псевдо-С++:
template <typename T> using type = has_type<T::U> ? int : float;
or
template <typename T> using type = if_has_type<T::U, int, float>::type;
Я подумал об использовании чего-то вроде метода, описанного на https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Member_Detector (раздел «Определение типов членов»), но я не знаю, как реализовать вспомогательную структуру, [единственный] тип члена которой зависит от существования другого типа члена.