昇腾社区首页
中文
注册

is_base_of

功能说明

is_base_of是定义于<type_traits>头文件的一个类型特征工具,它能够在程序编译时检查一个类型是否为另一个类型的基类。本接口可应用在模板元编程、类型检查和条件编译等场景,用于在编译阶段捕获潜在的类型错误,提高代码的鲁棒性。

函数原型

1
2
template <typename Base, typename Derived>
struct is_base_of;

参数说明

表1 模板参数说明

参数名

含义

Base

待检查的基类类型,即Base类型是否为Derived类型的基类

Derived

待检查的派生类类型,即Base类型是否为Derived类型的基类

支持的型号

Atlas A2 训练系列产品/Atlas 800I A2 推理产品

约束说明

返回值

is_base_of的静态常量成员value用于获取返回的布尔值,is_base_of<Base, Derived>::value取值如下:

  • true:Base类型是Derived类型的基类(包括Base类型和Derived类型为同一类型的情况)。
  • false:Base类型不是Derived类型的基类。

调用示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Base {};
class Derived : public Base {};
class Unrelated {};

// 虚继承的派生类
class Derived2 : virtual public Base {};

// 定义虚继承的派生类
class VirtualDerived : virtual public Base {};

// 定义多重继承的派生类
class MultiDerived : public Base, public VirtualDerived {};

// 模板基类
template <typename T>
class BaseTemplate {
public:
    T value;
};

// 模板派生类
template <typename T>
class DerivedTemplate : public BaseTemplate<T> {};

// 检查 Base 是否是 Derived 的基类
AscendC::PRINTF("Is Base a base of Derived? %d\n" , AscendC::Std::is_base_of<Base, Derived>::value);

// 检查 Derived 是否是 Base 的基类(应该为 false)
AscendC::PRINTF("Is Derived a base of Base? %d\n" , AscendC::Std::is_base_of<Derived, Base>::value);

// 检查 Base 是否是 Unrelated 的基类(应该为 false)
AscendC::PRINTF("Is Base a base of Unrelated? %d\n" , AscendC::Std::is_base_of<Base, Unrelated>::value);

AscendC::PRINTF("Is Base a base of Derived (virtual inheritance)? %d\n", AscendC::Std::is_base_of<Base, Derived2>::value);

AscendC::PRINTF("Is BaseTemplate<int> a base of DerivedTemplate<int>? %d\n", AscendC::Std::is_base_of<BaseTemplate<int>, DerivedTemplate<int>>::value);

// 测试 Base 是否为 VirtualDerived 的基类(虚继承情况)
AscendC::PRINTF("Is Base a base of VirtualDerived? %d\n" , AscendC::Std::is_base_of<Base, VirtualDerived>::value);
// 测试 Base 是否为 MultiDerived 的基类(多重继承情况)
AscendC::PRINTF("Is Base a base of MultiDerived? %d\n" , AscendC::Std::is_base_of<Base, MultiDerived>::value);
1
2
3
4
5
6
7
8
// 执行结果:
Is Base a base of Derived? 1
Is Derived a base of Base? 0
Is Base a base of Unrelated? 0
Is Base a base of Derived (virtual inheritance)? 1
Is BaseTemplate<int> a base of DerivedTemplate<int>? 1
Is Base a base of VirtualDerived? 1
Is Base a base of MultiDerived? 1