gpt4 book ai didi

c++ - 使用 C++17 是否可以检测结构/类是否有任何基础?

转载 作者:IT老高 更新时间:2023-10-28 12:32:25 29 4
gpt4 key购买 nike

我需要一个类型特征,如果给定类型派生自任何东西,则该特征为真,否则为假。

例如:

template<class T>
struct is_inherit
//... logic of inheritance detection
;

template<class T>
void AppLogic(){
if constexpr(is_inherit<T>::value) {
puts("T has base");
//...
} else {
puts("T doesn't have base");
//...
}
}

struct A {};
struct C {};
struct B: C {};

int main() {
AppLogic<A>(); // print: T doesn't have base
AppLogic<B>(); // print: T has base
}

是否有可能以某种方式实现“is_inherit”特征结构?


为什么?

我正在为 Windows x64 开发手动堆栈框架构建器。根据 https://learn.microsoft.com/en-us/cpp/build/return-values-cpp文档,如果是类型:

  • 长度为 1、2、4、8、16、32 或 64 位;
  • 没有用户定义的构造函数、析构函数或复制赋值运算符;
  • 没有私有(private)或 protected 非静态数据成员;
  • 没有引用类型的非静态数据成员;
  • 没有基类;
  • 没有虚函数;
  • 并且没有不符合这些要求的数据成员;

那么它的返回值在RAX寄存器中,否则函数有一个我必须检测和处理的隐藏参数。

这曾经是 C++03 POD 的定义,但在 C++11 中发生了变化:

Because the definition has changed in the C++11 standard, we do not recommend using std::is_pod for this test.

到目前为止,通过一些共轭特征,我可以检测该类型是否符合 C++03 POD 的定义。然而,随着 C++17 的聚合规则发生了变化,这打破了我的解决方案。

如果我能以某种方式检测类型 T 是否有任何基类,我的解决方案将再次起作用。

最佳答案

是的,这是可能的,至少对于聚合而言。

首先我们构造一个类模板,它可以转换为其模板参数的任何适当的基:

template<class T>
struct any_base {
operator T() = delete;
template<class U, class = std::enable_if_t<std::is_base_of_v<U, T>>> operator U();
};

然后我们检测是否有模板参数T可从 any_base<T> 类型的值构造聚合:

template<class, class = void> struct has_any_base : std::false_type {};
template<class T>
struct has_any_base<T, std::void_t<decltype(T{any_base<T>{}})>> : std::true_type {};

Example .

关于c++ - 使用 C++17 是否可以检测结构/类是否有任何基础?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46195465/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com