2013-03-08 1 views
-1

У меня есть тройной класс иерархии: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>?

+0

Вы не знаете о наследовании «шаблона» или не знаете о наследовании «singleton»? –

+3

"' template class Singleton; '" - вы плохи, и вам должно быть плохо. Распечатайте все строки своего кода словом «singleton» в нем и сожгите их. – Xeo

+3

'$ grep -Rli singleton. | xargs shred' –

ответ

1

Я не знаком с CRTP (http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern), но как насчет того, чтобы сделать базу самой шаблоном?

template<class T> class Singleton;

template<class T> class Base : public Singleton<T>;

class Sub : public Base<Sub>;

+0

Да, подумал об этом. Но это создает проблемы с полиморфизмом.Теперь Sub и Base не являются полиморфными, если вы используете их в третьем классе шаблонов. Например: MyPointer t = MyPointer (); – goocreations

8

Так что внешние разработчики не придется беспокоиться о шаблонах и сложности.

Невозможно. Единственный способ, которым вы можете создать Base и Singleton, чтобы удалить требование передать параметр шаблона в Singleton, - это вместо этого передать его Base, что не улучшилось.

Кроме того, разумно ожидать, что разработчик C++ сможет использовать CRTP.

Наконец, синглтоны всасывают самый ужасный способ. Если вы цените свое здравомыслие, немедленно удалите его.

+2

Я рад видеть, что моя сильная ненависть к синглонам делится людьми намного умнее меня ;-) –

+1

@MadKeithV Я с тобой, но будьте осторожны с [уклоном подтверждения] (http: //en.wikipedia. org/wiki/Confirmation_bias) и [обращение к власти] (http://en.wikipedia.org/wiki/Argument_from_authority). –

+2

+1 для «Синглтонов сосать самым ужасным образом» – Lars