Помимо вашей опечатки отсутствует typename
, проблема здесь:
using type = std::conditional_t<
is_a<T>::value,
T::type, // if it's an A, go deeper
T>; // if not, we're done
означает, что std::conditional
не является коротким замыканием. Если T
не имеет элемента type
, это приведет к ошибке.
Вы можете написать мета-функцию для рекурсивного извлечения внутреннего типа:
template<class T>
struct extract_type {
using type = T;
};
template<class T> class A;
template<class T>
struct extract_type<A<T>> {
using type = typename extract_type<T>::type;
};
template<typename T>
struct A
{
using type = typename extract_type<T>::type;
};
int main()
{
A<A<A<A<A<double>>>>>::type d = 3.0;
return 0;
}