Ограничить параметр шаблона C ++ для подclassа

Как заставить параметр шаблона T быть подclassом определенного classа Baseclass ? Что-то вроде этого:

 template  void function(){ T *object = new T(); } 

В этом случае вы можете:

 template  void function(){ Baseclass *object = new T(); } 

Это не будет компилироваться, если T не является подclassом Baseclass (или T является базовым classом).

С компилятором, совместимым с C ++ 11, вы можете сделать что-то вроде этого:

 template class MyClass { MyClass() { // Compile-time sanity check static_assert(std::is_base_of::value, "Derived not derived from BaseClass"); // Do other construction related stuff... ... } } 

Я протестировал это, используя компилятор gcc 4.8.1 внутри среды CYGWIN, поэтому он должен работать и в средах * nix.

Чтобы выполнить менее бесполезный код во время выполнения, вы можете посмотреть: http://www.stroustrup.com/bs_faq2.html#constraints, который предоставляет некоторые classы, которые эффективно выполняют анализ времени компиляции и создают более приятные сообщения об ошибках.

В частности:

 template struct Derived_from { static void constraints(T* p) { B* pb = p; } Derived_from() { void(*p)(T*) = constraints; } }; template void function() { Derived_from(); } 

Вам не нужны понятия, но вы можете использовать SFINAE:

 template  boost::enable_if< boost::is_base_of::value >::type function() { // This function will only be considered by the compiler if // T actualy derived from Base } 

Обратите внимание, что это будет создавать экземпляр функции только тогда, когда условие выполнено, но это не даст разумной ошибки, если условие не выполняется.

Вы можете использовать BOOST_CONCEPT_REQUIRES :

 #include  #include  template  BOOST_CONCEPT_REQUIRES( ((boost::Convertible)), (void)) function() { //... } 

Вызов функций внутри вашего шаблона, существующих в базовом classе.

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

  • Динамически регистрировать методы конструктора в AbstractFactory во время компиляции с использованием шаблонов C ++
  • Как работает эта функция шаблона «размер массива»?
  • Razor рассматривает как шаблоны электронной почты
  • std :: enable_if: параметр vs template
  • static_assert не удается выполнить компиляцию, хотя функция шаблона называется нигде
  • Можно ли создавать стандартные шаблоны контейнеров с неполными типами?
  • Лучший способ избежать невидимости публичного участника и разрастания / повторения исходного кода с унаследованными шаблонами classов?
  • C ++ Статическая инициализация члена (внутри шаблона)
  • C ++ 11: я могу перейти от нескольких аргументов к кортежу, но могу ли я перейти от кортежа к нескольким аргументам?
  • Выделить всю строку TreeViewItem в WPF
  • Обнаружение constexpr с помощью SFINAE
  • Interesting Posts

    Апострофы и двойные кавычки не отображаются до тех пор, пока я не наберу следующую букву

    Как удалить пунктирную границу вокруг активных гиперссылок в IE8 с помощью CSS

    Каков правильный способ свести к минимуму использование приложения C # WinForms?

    C – инициализация указателей, позиция звездочки

    Как зашифровать данные в битбакете без потери инструментов git diff?

    Regex заменить все \ n на String, но не те внутри тега

    Окно столбца DataGridView – значение и функциональность

    Как записать ISO на USB-накопитель в Mac OS X?

    При преобразовании проекта в использование ARC, что означает «случай переключения в защищенной области»?

    Что и где находятся стек и куча?

    Включает ли Kinect инфракрасный просмотр смещение с глубиной обзора Kinect

    Использовать проверку ASP.NET MVC с помощью jquery ajax?

    Установите Chromium для автоматического перевода всех языков

    Преобразование строки в double в C #

    Ubuntu 64-бит и 32-разрядный

    Давайте будем гением компьютера.