Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::is_base_of(3)	      C++ Standard Libary	    std::is_base_of(3)

NAME
       std::is_base_of - std::is_base_of

Synopsis
	  Defined in header <type_traits>
	  template< class Base,	class Derived >	 (since	C++11)
	  struct is_base_of;

	  If  Derived  is  derived from	Base or	if both	are the	same non-union
       class (in both
	  cases	ignoring cv-qualification), provides the member	constant value
       equal to	true.
	  Otherwise value is false.

	  If both Base and Derived are non-union class types, and they are not
       the same	type
	  (ignoring cv-qualification), Derived shall be	a complete type;  oth-
       erwise the
	  behavior is undefined.

	  The behavior of a program that adds specializations for is_base_of
	  or is_base_of_v
	  (since C++17)	is undefined.

	 Helper	variable template

	  template< class Base,	class Derived >
	  inline    constexpr	 bool	 is_base_of_v	 =    is_base_of<Base,
       (since C++17)
	  Derived>::value;

       Inherited from std::integral_constant

Member constants
	  value	   true	if Derived is derived from Base	or  if	both  are  the
       same non-union
	  [static] class (in both cases	ignoring cv-qualification), false oth-
       erwise
		   (public static member constant)

Member functions
	  operator bool	converts the object to bool, returns value
			(public	member function)
	  operator()	returns	value
	  (C++14)	(public	member function)

Member types
	  Type	     Definition
	  value_type bool
	  type	     std::integral_constant<bool, value>

Notes
	  std::is_base_of<A,  B>::value	 is  true even if A is a private, pro-
       tected, or ambiguous
	  base class of	B. In many situations, std::is_convertible<B*, A*>  is
       the more
	  appropriate test.

	  Although  no	class is its own base, std::is_base_of<T, T>::value is
       true because the
	  intent of the	trait is to model the "is-a" relationship, and T is  a
       T. Despite that,
	  std::is_base_of<int,	int>::value is false because only classes par-
       ticipate	in the
	  relationship that this trait models.

	 Possible Implementation

	  namespace details {
	      template <typename B>
	      std::true_type test_pre_ptr_convertible(const volatile B*);
	      template <typename>
	      std::false_type test_pre_ptr_convertible(const volatile void*);

	      template <typename, typename>
	      auto test_pre_is_base_of(...) -> std::true_type;
	      template <typename B, typename D>
	      auto test_pre_is_base_of(int) ->
		  decltype(test_pre_ptr_convertible<B>(sta-
       tic_cast<D*>(nullptr)));
	  }

	  template <typename Base, typename Derived>
	  struct is_base_of :
	      std::integral_constant<
		  bool,
		  std::is_class<Base>::value &&	 std::is_class<Derived>::value
       &&
		  decltype(details::test_pre_is_base_of<Base,		   De-
       rived>(0))::value
	      >	{ };

Example
       // Run this code

	#include <iostream>
	#include <type_traits>
	#define	SHOW(...) \
	    std::cout << #__VA_ARGS__ << " : " \
		      << std:: __VA_ARGS__ << '\n'
	int main()
	{
	    class A {};
	    class B : A	{};
	    class C : B	{};
	    class D {};

	    std::cout << std::boolalpha;
	    SHOW( is_base_of_v<A, A> );
	    SHOW( is_base_of_v<A, B> );
	    SHOW( is_base_of_v<A, C> );
	    SHOW( is_base_of_v<A, D> );
	    SHOW( is_base_of_v<B, A> );
	    SHOW( is_base_of_v<int, int> );
	}

Output:
	is_base_of_v<A,	A> : true
	is_base_of_v<A,	B> : true
	is_base_of_v<A,	C> : true
	is_base_of_v<A,	D> : false
	is_base_of_v<B,	A> : false
	is_base_of_v<int, int> : false

See also
	  is_convertible
	  is_nothrow_convertible checks	if a type  can	be  converted  to  the
       other type
	  (C++11)		 (class	template)
	  (C++20)
	  derived_from		 specifies that	a type is derived from another
       type
	  (C++20)		 (concept)

http://cppreference.com		  2022.07.31		    std::is_base_of(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::is_base_of&sektion=3&manpath=FreeBSD+Ports+15.0>

home | help