小编Nyu*_*ufu的帖子

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

我需要一个类型特征,如果给定的类型派生自任何东西,则为true,否则为false.

例如:

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
}
Run Code Online (Sandbox Code Playgroud)

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


为什么?

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

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

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

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

由于C++ 11标准中的定义已更改,因此我们不建议您使用 …

c++ inheritance type-traits c++17

36
推荐指数
2
解决办法
2949
查看次数

标签 统计

c++ ×1

c++17 ×1

inheritance ×1

type-traits ×1