Можно! Нет
( аналогичный вопрос )
Не думаю, что это сработает. Для того, чтобы определить класс Derived
, вам нужно сначала знать базовый класс («это должен быть полный тип»); чтобы создать экземпляр шаблона Base
в классе, вам необходимо иметь тип. Однако Inner
- это только тип "внутри" Derived
; это часть его определения.
Definition of Derived ---needs---> Base<Derived::Inner>
^ |
|----------needs----------------|
Даже косвенное обращение не помогает:
template<typename T>
class Base {};
template<template<class> class X, typename T>
struct UseInner : public X<typename T::Inner> {};
class Derived : UseInner<Base, Derived>
{
public: class Inner {};
};
В отличие от этого, CRTP работает, потому что там параметром шаблона может быть неполный тип («нет необходимости обращаться к внутренним компонентам»).
Не работает перенос в шаблон:
template<typename T>
class Base {};
template<template<class>class X>
struct Wrap
{
struct Derived : X<typename Derived::Inner> {
struct Inner {};
};
};
using RealDerived = typename Wrap<Base>::Derived;