gpt4 book ai didi

c++ - c++编译时断言BASE是EXTENDED的基类,并且具有相同的内存地址

转载 作者:行者123 更新时间:2023-12-01 14:50:37 24 4
gpt4 key购买 nike

struct A
{
};
struct B : A
{
virtual ~B() {}
};
template<typename BASE, typename EXTENDED>
void ASSERT_BASE_EXTENDED()
{
static_assert(static_cast<BASE*>((EXTENDED*)256)==(BASE*)256, "error");
}

我正在寻找一种具有编译时断言的方法,以检查BASE类是否为EXTENDED的基数,并且它们具有相同的内存地址。

在上面的示例中,即使B基于A,当转换为A时,它也具有不同的内存地址,因为虚函数表指针实际上是B的第一个成员。但是我需要检查A是否是第一个成员。

上面的方法可以正常工作,但不能在编译时使用,因为使用VS 2017编译器时出现错误“错误C2131:表达式未求值为常量”。

我对“std::is_base_of”不感兴趣,因为那会忽略检查相同的内存地址。
还有另一种方法吗?

谢谢

最佳答案

内存地址是运行时构造。您无法在编译时检查它们,因为那时它们不存在。您提到的这种类型的转换也是如此。那完全在运行时发生。您必须使用运行时检查和错误处理来替换static_assert,例如assert()或异常。

这是imo的常见用例。对于像您的示例中那样的硬编码内存地址,问题在于这些地址int转换为指针。唯一有效的方法是reinterpret_cast(这是编译器尝试在您的示例中使用C样式强制转换的强制转换之一),因为int类型和指向T的指针完全无关。但是在编译时不允许使用reinterpret_cast。

Clang的错误讯息说得很好:

main.cpp:14:38: note: cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression
static_assert(static_cast<BASE*>((EXTENDED*)256)==(BASE*)256, "error");
^

关于c++ - c++编译时断言BASE是EXTENDED的基类,并且具有相同的内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46508588/

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