std::is_virtual_base_of
From cppreference.com
| ヘッダ <type_traits> で定義 |
||
| template< class Base, class Derived > struct is_virtual_base_of; |
(C++26以降) | |
std::is_virtual_base_of は BinaryTypeTrait です。
Base が Derived の 仮想基底クラス である場合(cv修飾を無視)、メンバ定数 value は true になります。それ以外の場合、value は false になります。
Base と Derived の両方が非共用体クラス型(cv修飾を無視)である場合、Derived は 不完全型 である必要があります。それ以外の場合、動作は未定義です。
プログラムが std::is_virtual_base_of または std::is_virtual_base_of_v の特殊化を追加した場合、動作は未定義です。
目次 |
[編集] ヘルパー変数テンプレート
| template< class Base, class Derived > constexpr bool is_virtual_base_of_v = is_virtual_base_of<Base, Derived>::value; |
(C++26以降) | |
std::integral_constant から継承
メンバ定数
| value [static] |
Derived が仮想基底クラス Base から派生している場合は true、それ以外の場合は false (cv修飾を無視)(公開静的メンバ定数) |
メンバ関数
| operator bool |
オブジェクトを bool に変換し、value を返します。 (public member function) |
| operator() (C++14) |
value を返します。 (public member function) |
メンバ型
| 型 | 定義 |
value_type
|
bool |
type
|
std::integral_constant<bool, value> |
[編集] 注記
std::is_virtual_base_of_v<A, B> は、A が B の private, protected, または曖昧な基底クラスであっても true です。
もし std::is_virtual_base_of_v<A, B> が true ならば、std::is_base_of_v<A, B> も true です。しかし、逆は常に真ではありません。これは、仮想継承のチェックがより具体的であるためです。この場合、T が非共用体クラス型であっても、std::is_virtual_base_of_v<T, T> は false になります。
[編集] 例
このコードを実行
#include <type_traits> class A {}; class B : A {}; class C : B {}; class D : virtual A {}; class E : D {}; union F {}; using I = int; static_assert ( std::is_virtual_base_of_v<A, A> != true && std::is_virtual_base_of_v<A, B> != true && std::is_virtual_base_of_v<A, D> == true && std::is_virtual_base_of_v<D, E> != true && std::is_virtual_base_of_v<F, F> != true && std::is_virtual_base_of_v<I, I> != true ); int main() {}
[編集] 関連項目
| (C++11) |
ある型が他の型の基底であるかをチェックする (クラステンプレート) |
| (C++11)(C++20) |
ある型が他の型に変換可能であるかをチェックする (クラステンプレート) |
| (C++20) |
型が別の型から派生していることを規定する (コンセプト) |