如何获取派生自 base class 的类型名?

How to get typename defined in derived from base class?

template <class Derived>
struct Base {
  typedef typename Derived::T T;
};

template <typename T_>
struct Impl : public Base<Impl<T_>> {
  typedef T_ T;
};

初始化这个时,我得到了

的错误

no type named 'T' in 'Impl'

那么,如何获取派生自基 class 的类型名?

想办法去做,虽然不完美但确实有效。

template <class T>
struct traits;

template <class Derived>
struct Base {
  typedef typename traits<Derived>::T T;
};

template <typename T_>
struct Impl : public Base<Impl<T_>> {
  typedef T_ T;
};

template <typename T_>
struct traits<Impl<T_>> {
  typedef T_ T;
};

它并不完美,因为在特征 class 中,我不能写

typedef typename Impl<T_>::T T;

仍未定义。