Namespaces
Variants

std:: derived_from

From cppreference.net
Определено в заголовочном файле <concepts>
template < class Derived, class Base >

concept derived_from =
std:: is_base_of_v < Base, Derived > &&

std:: is_convertible_v < const volatile Derived * , const volatile Base * > ;
(начиная с C++20)

Концепт derived_from < Derived, Base > выполняется тогда и только тогда, когда Base является типом класса, который представляет собой либо Derived , либо открытый и однозначный базовый класс для Derived , без учета cv-квалификаторов.

Обратите внимание, что это поведение отличается от std::is_base_of , когда Base является приватным или защищённым базовым классом для Derived .

Пример

#include <concepts>
class A {};
class B : public A {};
class C : private A {};
// std::derived_from == true только для публичного наследования или точно такого же класса
static_assert(std::derived_from<B, B> == true);      // тот же класс: true
static_assert(std::derived_from<int, int> == false); // тот же примитивный тип: false
static_assert(std::derived_from<B, A> == true);      // публичное наследование: true
static_assert(std::derived_from<C, A> == false);     // приватное наследование: false
// std::is_base_of == true также для приватного наследования
static_assert(std::is_base_of_v<B, B> == true);      // тот же класс: true
static_assert(std::is_base_of_v<int, int> == false); // тот же примитивный тип: false
static_assert(std::is_base_of_v<A, B> == true);      // публичное наследование: true
static_assert(std::is_base_of_v<A, C> == true);      // приватное наследование: true
int main() {}

Ссылки

  • Стандарт C++23 (ISO/IEC 14882:2024):
  • 18.4.3 Концепт derived_from [concept.derived]
  • Стандарт C++20 (ISO/IEC 14882:2020):
  • 18.4.3 Концепт derived_from [concept.derived]

Смотрите также

(C++11)
проверяет, является ли тип базовым для другого типа
(class template)
проверяет, может ли тип быть преобразован в другой тип
(class template)