gpt4 book ai didi

c++ - 编译时间测试两个类之间的 void* 类型转换安全性

转载 作者:行者123 更新时间:2023-11-28 07:52:12 25 4
gpt4 key购买 nike

#include <cassert>

struct a
{
virtual ~a() {}
char a_[10];
};

struct b
{
virtual ~b() {}
char b_[20];
};

struct c : public a
{
virtual ~c() {}
char c_[15];
};

struct d : public b, a
{
virtual ~d() {}
char d_[5];
};

int main()
{
a a_;
c c_;
d d_;

a* a__ = &a_;
a* c__ = &c_;
a* d__ = &d_;

assert((void*)&a_ == (void*)a__);
assert((void*)&c_ == (void*)c__);
assert((void*)&d_ == (void*)d__); // error on most compiler
}

我正在寻找一种方法来测试类继承图中的 void* 转换安全性,它可以在编译时检测到第三个断言。

template<typename Base, typename Derived>
struct test
{
enum {
is_safe = (static_cast<Derived*>(static_cast<Base*>(nullptr)) == nullptr)
};
};

我的意图在上面的代码中有描述,但不会被编译,因为转换不是常量表达式。是否可以以独立于平台/编译器的方式检查它?

最佳答案

根据标准,从X 转换为void* 然后从void* 转换为Y 是仅当 XY 相同时才是明确定义的。其他一切都是未定义的行为。因此,test 唯一可能的可移植、符合标准的定义是:

template<typename Base, typename Derived>
struct test
{
enum {
is_safe = false;
};
};

template <typename X>
struct test<X, X>
{
enum {
is_safe = true;
};
};

关于c++ - 编译时间测试两个类之间的 void* 类型转换安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13551489/

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