проверить аргумент шаблона - PullRequest
0 голосов
/ 10 января 2012

У меня есть шаблон класса (A).Как я могу проверить, является ли класс T производным от абстрактного класса IClass?

template <class T>
class A 
{
       //T have to be derived from abstract class IClass
} ;

спасибо

Ответы [ 2 ]

4 голосов
/ 10 января 2012

Использование статических утверждений и is_base_of из Boost, TR1 или C ++ 11:

template <class T>
class A {
public:
    BOOST_STATIC_ASSERT(( boost::is_base_of<IClass, T>::value )); 
};
1 голос
/ 10 января 2012

То, что вы пытаетесь сделать, называется проверкой концепции шаблона.Это должно было быть функцией в C ++ 11, но комитет по стандартам урезал ее.

Вы все еще можете сделать это, хотя она не так чиста, как могла бы быть в противном случае.Бьярн Страуструп объясняет, как это сделать, в своем FAQ: http://www2.research.att.com/~bs/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> class A : Derived_from<T,IClass> { ... }

Страуструп отметил, что это фактически проверяет преобразование, а не наследование.Может быть, есть способ проверить только наследование, если это то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...