Как заставить параметр шаблона T
быть подклассом определенного класса Baseclass
?
Что-то вроде этого:
template <class T : Baseclass> void function(){
T *object = new T();
}
Как заставить параметр шаблона T
быть подклассом определенного класса Baseclass
?
Что-то вроде этого:
template <class T : Baseclass> void function(){
T *object = new T();
}
В этом случае вы можете сделать:
template <class T> void function(){
Baseclass *object = new T();
}
Это не будет компилироваться, если T не является подклассом Baseclass (или T является базовым классом).
С компилятором, совместимым с С++ 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.
Чтобы выполнить менее бесполезный код во время выполнения, вы можете посмотреть: 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>();
}
Вам не нужны понятия, но вы можете использовать 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
}
Обратите внимание, что это создаст экземпляр функции только тогда, когда условие будет выполнено, но оно не даст разумной ошибки, если условие не выполнено.
Вы можете использовать "Проверка уровня поддержки" 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()
{
//...
}
Вызов функций внутри вашего шаблона, существующих в базовом классе.
Если вы попытаетесь создать экземпляр своего шаблона с типом, который не имеет доступа к этой функции, вы получите ошибку времени компиляции.