2015-04-10 7 views
2

Я хотел бы использовать абстрактные базовые классы для своих классов. Эти абстрактные классы служили бы целям интерфейсов. Они присутствуют только в качестве самопроверки, чтобы убедиться, что все необходимые члены реализованы. Это ускоряет разработку. Поскольку сообщения об ошибках намного чище, чем onces, которые будут создаваться из шаблонов.Отключить наследование от базового класса в C++ в режиме освобождения

Поскольку я собираюсь использовать классы реализации в шаблонах, базовый класс сам по себе не понадобится в сборке релизов. Фактически, это только вводит накладные расходы, хотя это и мало.

Есть ли какая-то препроцессорная магия, которая позволяет мне наследовать эти классы абстрактных интерфейсов только в том случае, если определены символы отладки?

+1

Использование макроса NDEBUG должно выполнять трюк: 'class Derived \ n #ifndef NDEBUG \ n: public AbstractBase \ n # endif \ n {// body};' – NetVipeC

+1

Препроцессор - это инструмент для замены текста, вы можете сделать это напишите любую программу. Тем не менее, я бы не сказал, что это хорошая идея использовать его для этого. Кроме того, перед тем, как вы начнете такие хаки, проведите свой код, чтобы доказать, что это действительно те ABC, которые вызывают замедление. Кроме того, просто чтобы убедиться, что тип имеет функцию, используйте статические утверждения или что-то подобное, для этого вам не нужны ABC. –

+0

@Ulrich Eckhardt: статические звуки утверждают, что это действительно лучший способ сделать это :) спасибо! –

ответ

5

Вы можете скрыть некоторые беспорядочности макросов с шаблонами.

template <bool UseAbstractBase> class BaseT; 

template <> 
class BaseT<true> : public AbstractBase {}; 

template <> 
class BaseT<false> {}; 

#ifndef USE_ABSTRACT_BASE 
#define USE_ABSTRACT_BASE false 
#endif 

class Derived : BaseT<USE_ABSTRACT_BASE> { 
    //... 
}; 

Теперь, если вы определяете USE_ABSTRACT_BASE к true, ваши полученные объекты будут принимать интерфейс от AbstractBase. Если вы оставите его неопределенным, ваши производные объекты не наследуют абстракции.

Смежные вопросы