У меня есть тройной класс иерархии:C++ Template Параметр автоматически с именем класса
template<class T> class Singleton;
class Base;
class Sub : public Base, public Singleton<Sub>;
Я с помощью основного авто указателей, поэтому Singleton шаблонного класса и Sub передает себя в качестве параметра шаблона. Я разрабатываю Singleton и Base, а общедоступный API позволяет каждому добавлять свои собственные подклассы. Я на самом деле хочу, реальная тройная иерархия, как это:
template<class T> class Singleton;
class Base : public Singleton<Base>;
class Sub : public Base;
Так что внешние разработчики не придется беспокоиться о шаблонах и сложности. Проблема в том, что моя реализация в Singleton теперь вызовет конструктор Base всякий раз, когда я создаю экземпляр Sub (поскольку параметр шаблона Base).
мне было интересно, если это может быть сделано путем предварительной обработки макросов:
template<class T> class Singleton;
class Base : public Singleton<__CLASS_NAME__>;
class Sub : public Base;
Где __CLASS_NAME__
это имя класса, который будет заменен на препроцессор. Теоретически это должно быть возможно, так как макрос __PRETTY_FUNCTION__
фактически возвращает имя класса. Проблема заключается в том, что нельзя выполнять строковое манипулирование для удаления имени функции с __PRETTY_FUNCTION__
.
Любые идеи о том, как я могу это сделать, чтобы класс Sub не знал о наследовании от класса Singleton<template>
?
Вы не знаете о наследовании «шаблона» или не знаете о наследовании «singleton»? –
"' template class Singleton; '" - вы плохи, и вам должно быть плохо. Распечатайте все строки своего кода словом «singleton» в нем и сожгите их. –
Xeo
'$ grep -Rli singleton. | xargs shred' –