std::derived_from

来自cppreference.com
< cpp‎ | concepts
在标头 <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> 当且仅当忽略 cv 限定符后 Base 是类类型,且它为 Derived 或是 Derived 的公开无歧义基类才得到满足。

注意当 BaseDerived 的私有或受保护基类时,此行为异于 std::is_base_of

示例

#include <concepts>
 
class A {};
 
class B: public A {};
 
class C: private A{};
 
int main() {
    // 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
}

参阅

检查一个类型是否派生自另一个类型
(类模板)
检查是否能转换一个类型为另一类型
(类模板)