最終更新日時: 2025年07月03日 18時44分28秒 (JST)
Raclamusi が更新

履歴 編集

class template
<type_traits>

# std::is_virtual_base_of(C++26)

    namespace std {
      template <class Base, class Derived>
      struct is_virtual_base_of;

      template <class Base, class Derived>
      inline constexpr bool is_virtual_base_of_v = is_virtual_base_of<Base, Derived>::value;
    }

## 概要

型`Base`が型`Derived`の仮想基底クラスか調べる。

## 要件

`Base`と`Derived`が非共用体のクラスであり、異なる型である場合(cv修飾は無視される)、`Derived`は完全型でなければならない。

## 効果

`is_virtual_base_of`は、型`Base`が型`Derived`の仮想基底クラス (cv修飾は無視される) であるならば`true_type`から派生し、そうでなければ`false_type`から派生する。

## 備考

派生時の`private`、`protected`指定は、派生関係の判定に影響しない。

## 例

    #include <type_traits>

    struct B {};
    struct B1 : virtual public B {};
    struct B2 : virtual public B {};
    struct D : public B1, public B2 {};

    static_assert(std::is_virtual_base_of_v<B, D> == true);
    static_assert(std::is_virtual_base_of_v<B, B1> == true);
    static_assert(std::is_virtual_base_of_v<B, B2> == true);

    // cv修飾は無視される
    static_assert(std::is_virtual_base_of_v<const B, const D> == true);

    // クラス型ではない
    static_assert(std::is_virtual_base_of_v<int, char> == false);

    int main() {}

### 出力

## バージョン

### 言語

- C++26

### 処理系

- Clang: 21.0 ✅
- GCC: 15 ✅
- Visual C++: 2022 Update 10 ❌

## 参照

- P2985R0 A type trait for detecting virtual base classes