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");
}
を持っている私は、基本クラスはEXTENDEDのベースであるかどうかを確認するために、コンパイル時のアサーションを持つ方法を探していますし、彼らが持っているコンパイル同じメモリアドレス。C++そのBASEアサート時間はEXTENDEDの基底クラスで、同じメモリアドレスに
上記の例では、BがAに基づいていても、Aにキャストされると、仮想関数テーブルポインタは実際にはBの最初のメンバーなので、別のメモリアドレスを持ちます。Aが最初のメンバー。
上記の動作はOKですが、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