Утверждение шаблона в C ++? - PullRequest
       16

Утверждение шаблона в C ++?

0 голосов
/ 28 января 2010

Есть ли способ определить шаблон

assertInheritsFrom<A, B>

такой, что

assertsInheritsFrom<A, B>

компилируется тогда и только тогда, когда

class A : public B { ... } // struct A is okay too

Спасибо!

Ответы [ 3 ]

5 голосов
/ 28 января 2010

Объединение статических утверждений с is_base_of<Base,Derived> из Boost.TypeTraits:

BOOST_STATIC_ASSERT(boost::is_base_of<B, A>::value);

Наивная реализация (без учета целочисленных типов, частных базовых классов и неоднозначностей) может выглядеть следующим образом:

template<class B, class D>
struct is_base_of {
    static yes test(const B&); // will be chosen if B is base of D
    static no  test(...);      // will be chosen otherwise
    static const D& helper();
    static const bool value = 
        sizeof(test(helper())) == sizeof(yes);
    // true if test(const B&) was chosen
};
2 голосов
/ 28 января 2010

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

РЕДАКТИРОВАТЬ: Еще одна ссылка для того же: http://www.ddj.com/cpp/184403750 Ищите Обнаружение конвертируемости и наследования

1 голос
/ 28 января 2010

Возможно, вы также захотите прочитать эту запись из C ++ FAQ Бьярна Страуструпа: Почему я не могу определить ограничения для параметров моего шаблона? (Ответ в том, что вы можете, и он приводит пример того, как реализовать ограничение Derived_from.)

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