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

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

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

6 Solutions collect form web for “Ограничить параметр шаблона C ++ для подclassа”

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

 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е.

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

  • Могут ли использоваться шаблоны lambda?
  • Явный экземпляр - когда он используется?
  • C ++ Статическая инициализация члена (внутри шаблона)
  • SFINAE для проверки наследуемых функций-членов
  • Почему я не могу использовать значение float в качестве параметра шаблона?
  • В чем преимущество шаблона без логики (например, усы)?
  • Двухэтапный поиск - требуется объяснение
  • C ++ 11 make_pair с указанными параметрами шаблона не компилируется
  • какова процедура частичного заказа в выводе шаблона
  • Обнаружение constexpr с помощью SFINAE
  • Инициализация статического члена в шаблоне classа
  • Interesting Posts

    Какова функция замены строки в C?

    Как установить совместимость процессоров в .NET?

    javax.net.ssl.SSLException: Ошибка чтения: ssl = 0x9524b800: ошибка ввода-вывода во время системного вызова, сброс соединения с помощью одноранговой сети

    Automapper: игнорировать при условии

    Проблемы с открытием вложений Excel из Outlook

    Требуются ли прототипы для всех функций на C89, C90 или C99?

    Как я могу сделать программу навсегда запущенной как администратор, когда отсутствует вкладка Совместимость?

    Разница между списком, списком , Списком , списком и списком

    Стиль определенных символов с CSS

    Как работает пропускная способность USB? Будет ли несколько устройств разделять ограничение 480 Мбит / с для USB 2.0?

    Как вы можете подключить три внешних дисплея к ноутбуку с одним портом vga или dvi и большим количеством портов USB?

    Мышь двойного щелчка мышью

    Загрузчик содержимого Android SDK не работает с NullPointerException

    Записывает ли Windows 7 все копии файлов?

    BigInteger в C?

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