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");
}
我正在尋找一種方式來有一個編譯時斷言檢查,如果基類的延伸的基礎,他們有相同的內存地址。C++編譯時斷言,BASE是基類的延伸,具有相同的內存地址
在上面的例子中,即使B是基於A的,當被轉換爲A時它具有不同的存儲器地址,因爲虛擬函數表指針實際上是B的第一個成員。但是我需要檢查如果A是第一名成員。
上述工作正常,但不是編譯時,因爲我得到一個錯誤:使用VS 2017年編譯器時,「錯誤C2131表達式的結果不是一個常量」。
我不感興趣「的std :: is_base_of」,因爲這一個忽略檢查相同的內存地址。 有沒有另一種方法來做到這一點?
謝謝
你想使用[_CRTP_(https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern)和'static_cast'? – user0042
CRTP是一個有趣的概念,但目標是不要修改現有的類,只調整ASSERT_BASE_EXTENDED函數。 – Esenthel