変更不可能なヘッダーで宣言されたフォワードC構造体があります。それにコンビニエンスメンバー関数を「仮想的に」追加したいと思います。明らかに、私の最初の選択は、構造体を拡張し、派生クラスにメソッドを追加することです。構造体自体がヘッダーで「転送」として宣言されているため、実行できません。そのため、「エラー:不完全な型の無効な使用...」というエラーが発生します。古い構造体の単一の要素を使用して新しい構造体を定義しようとすると、同様のエラーが発生します。これは最悪だ。
ただし、reinterpret_castを使用してハッカーを実行し、とにかく機能させることができると考えていました。それが行く方法はこれです:
//defined in header
struct A forward;
void do_something_with_A(A* a, int arg);
//defined in my wrapper
struct B {
B* wrap(A* a) {return reinterpret_cast<B*>(a); }
void do_something(int arg) {do_something_with_A(reinterpret_cast<A*>(this),arg); }
}
タイプBからタイプAへの暗黙の変換を追加した場合、これはBがAのゼロデータ継承者であるかのように機能する可能性があると考えていました。しかし、これは明らかに疑問を投げかけます。これはC ++では未定義ですか?通常、違法にキャストされた構造体の要素にアクセスすることは定義されていないと思います。それは理にかなっている。ただし、あるタイプから別のタイプにreinterpret_castingし、そのポインターを渡してから、間に違法なことを何もせずに再度キャストするのは問題ないと思います。また、コンパイラが非仮想構造体メンバーを実装する方法は、関数を作成することだと思います
B::do_something(B* b, int arg)
そして、Bの適切な引数を使用してそれを呼び出します。これは、前のケースに還元されます。これは、私の疑わしい論理では問題ありません。したがって、実際にはreinterpret_castAである構造体で.do_somethingを呼び出しても問題ないと思います。
ただし、これは、C++標準が実際に問題について述べていることについては何も述べていません。それで何か助けはありますか?また、誰かがこれが実際にどれだけうまく機能するかについての情報を持っている場合(つまり、「これまでに作成されたすべてのコンパイラがこれを受け入れる」、または「これは少数のコンパイラでのみ機能する」)、それも役立ちますが、少し劣ります。