тип? Например, у меня есть класс A с методом func(), я хочу создать шаблонную функцию, которая будет принимать объекты этого класса либо наследуемые от него, так что я смогу вызывать функцию func()
может как то так: #include <type_traits> struct A {}; struct B : A {}; struct C {}; template<class T> void fn() { static_assert(std::is_base_of<A,T>::value, "not A subtype"); } int main() { fn<A>(); fn<B>(); fn<C>(): // assertion failed }
спасибо за ответ
Это не надо контролировать, вся прелесть шаблонов в том, что они работают со всем, что под шаблон подходит. Если оно может кракать, то нам все равно, что это не утка.
Если C++ 20, то это можно сделать концертами.
А func() должна вызываться у наследника или у базы?
func() наследника
А если я передам int? Получается, что никаких проверок от самого языка не существует?
Для этого лучше подходят виртуальные функции Но в ином случае: void foo(std::derived_from<A> auto&& a) { std::forward<decltype(a)>(a).func(); } Аналогичный код на C++17 и ниже переписывается довольно просто и прямолинейно с помощью enable_if
Существует если тот класс не подойдет, оно не скомпилируется
Это разве прелесть?
Как ты лёгким движением руки проигнорировал SFINAE
Нет это данность
Ну оно не обязательно
А при чем тут оно?
При том, что "если класс не подойдёт, то не скомпилируется" — это немного не так, как работает C++
Обсуждают сегодня