Как проверить, что шаблонный класс является производным от заданного класса во время компиляции? - PullRequest
4 голосов
/ 05 мая 2011

Интересно, есть ли какой-нибудь элегантный способ (например, this ) для проверки того, что аргумент шаблона получен из заданного класса?В общем:

template<class A, class B>
class MyClass
{
    // shold give the compilation error if B is not derived from A
    // but should work if B inherits from A as private
}

решение, предоставленное в другом вопросе , работает только тогда, когда B наследует от A как public:

class B: public A

однако я бы предпочел нетакое ограничение:

class A{};
class B : public A{};
class C : private A{};
class D;
MyClass<A,B> // works now
MyClass<A,C> // should be OK
MyClass<A,D> // only here I need a compile error

Заранее спасибо !!!

Ответы [ 2 ]

7 голосов
/ 05 мая 2011

Вы можете попробовать что-то вроде того, что я сказал здесь: C ++: указание базового класса для параметра шаблона в статическом утверждении (C ++ 0x или BOOST_STATIC_ASSERT)

template<class A, class B> 
class MyClass 
{ 
  static_assert( boost::is_base_of<A,B>::value );
}
1 голос
/ 05 мая 2011

Частное наследование от чего-либо - это деталь реализации.

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

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