Без typedef это невозможно. Дело в том, что компилятор не знает, что T_Node
само по себе является экземпляром шаблона. Node<T>
- это просто тип , ничего более.
C ++ знает три уровня сущностей: значения, типы и шаблоны. Node
- это шаблон, а Node<T>
- это тип. Когда ваш шаблон класса принимает параметр type , у вас больше нет возможности проверить природу этого типа.
Сопоставление с образцом посредством частичной специализации - единственный способ извлечения такой информации, и вам не придется обойтись без функционального метапрограммирования. Любая проверка типов обычно называется «чертой типа». Все это сводится к одному и тому же, очень похоже на то, что вы уже предложили, но, возможно, вот еще один, более общий способ:
template <typename> struct ClassWithOneArg;
template <template <typename> class C, typename T>
struct ClassWithOneArg<C<T>>
{
typedef T value_type;
};
Теперь вы можете сказать: typedef typename ClassWithOneArg<T_Node>::value_type type;
.