Я пытаюсь сделать что-то необычное из шаблона, и наткнулся на проблему: я хотел бы получить тип класса внутри его определения при определении нестатического члена.Это возможно?(В любой версии C ++.)
Возьмите следующий код:
template<typename T>
struct inner {
T* this_;
/* fancy stuff... */
};
struct foo {
inner<foo> bar{this};
};
Класс foo
имеет нестатический член bar
, который инициализируется указателемfoo* this
.Этот код компилируется в clang и gcc.
Но на самом деле я хочу, чтобы определение inner
появилось в макросе, что означает, что у меня нет строки foo
для использования в строке inner<foo> bar{this}
,Попытка использовать:
inner bar{this};
в C ++ 17, которая позволяет выводить аргументы шаблона для шаблонов классов, выдает ошибку
error: использованиешаблон класса 'inner' требует аргументов шаблона;в нестатическом элементе структуры inner bar{this};
недопустим вывод аргументов, который я понимаю.Попытка:
inner<decltype(*this)> bar{this};
выдает похожую ошибку:
ошибка: недопустимое использование 'this' вне нестатической функции-члена inner<decltype(*this)> bar{this};
В качестве обходного пути я использовал следующий любопытно повторяющийся шаблон:
template<typename T>
struct SelfAwareType {
using myOwnType = T;
}
struct foo : SelfAwareType<foo> {
inner<myOwnType> bar{this};
};