is_base_of
产品支持情况
功能说明
is_base_of是定义于<type_traits>头文件的一个类型特征工具,它能够在程序编译时检查一个类型是否为另一个类型的基类。本接口可应用在模板元编程、类型检查和条件编译等场景,用于在编译阶段捕获潜在的类型错误,提高代码的鲁棒性。
函数原型
template <typename Base, typename Derived>
struct is_base_of;
参数说明
表 1 模板参数说明
约束说明
无
返回值说明
is_base_of的静态常量成员value用于获取返回的布尔值,is_base_of<Base, Derived>::value取值如下:
- true:Base类型是Derived类型的基类(包括Base类型和Derived类型为同一类型的情况)。
- false:Base类型不是Derived类型的基类。
调用示例
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);
// 执行结果:
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