Подтвердить что ты не робот

Ограничить параметр шаблона С++ для подкласса

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

template <class T : Baseclass> void function(){
    T *object = new T();

}
4b9b3361

Ответ 1

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

template <class T> void function(){
    Baseclass *object = new T();

}

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

Ответ 2

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

template<class Derived> class MyClass {

    MyClass() {
        // Compile-time sanity check
        static_assert(std::is_base_of<BaseClass, Derived>::value, "Derived not derived from BaseClass");

        // Do other construction related stuff...
        ...
   }
}

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

Ответ 3

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

В частности:

template<class T, class B> struct Derived_from {
        static void constraints(T* p) { B* pb = p; }
        Derived_from() { void(*p)(T*) = constraints; }
};

template<class T> void function() {
    Derived_from<T,Baseclass>();
}

Ответ 4

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

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

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

Ответ 5

Вы можете использовать "Проверка уровня поддержки" BOOST_CONCEPT_REQUIRES:

#include <boost/concept_check.hpp>
#include <boost/concept/requires.hpp>

template <class T>
BOOST_CONCEPT_REQUIRES(
    ((boost::Convertible<T, BaseClass>)),
(void)) function()
{
    //...
}

Ответ 6

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

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