Шаблон с проверкой типа
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Подскажите пожалуйста, как в шаблоне функции сделать проверку типа шаблона-аргумента. Например, есть такой набор классов и есть шаблонная функция:
В шаблонной функции на этапе компиляции надо проверить, что
arg
является объектом классаBase
, или класса-потомкаBase
(т.е.Derived1
илиDerived2
). Иначе говоря, надо проверить является лиT
классомBase
, или классом, унаследованным отBase
. Если это так, то все нормально. Иначе надо выдать ошибку компиляции с соответствующей диагностикой.В
<type_traits>
нашёл функциюtemplate<class Base, class Derived> struct is_base_of
, которая выполняет такую проверку, но как ее использовать в моем случае, не понимаю.Например, использовать его с std::enable_if
template <typename T, typename = std::enable_if_t<std::is_base_of<Base, T>::value, void>*>
void foo(T arg) { }
Также стоит учесть, что приватное наследование за пределами класса не видно. У Вас в коде наследование именно приватное.
Спасибо. Работает! Только не понимаю как.
Под Visual Studio 2017 видит даже приватное наследование.
Что именно не понятно?
std::is_base_of видит приватное наследование.
Я к тому, что далее, например, если попробовать создать указатель на базовый класс и присвоить ему адрес наследника, то будут проблемы:
Непонятно вот это
Что здесь происходит, и как это работает.
Можете посмотреть по ссылке: http://pcdev.ru/type-traits-enable-if/
hgkgk