押し付けがましいリストを書きたいとしましょう。ノードとして使用するメンバーへの型とポインターを受け取る侵入型のリスト クラス テンプレートがあります。おおよそ次のようになります。
// This needs to be a member of anything the intrusive list is going to store.
class IntrusiveListNode {
// ...
}
// The intrusive list itself
template <class T, IntrusiveListNode T::*Member>
class IntrusiveList {
// ...
};
// This is a type that is going to be stored in an intrusive list.
class IntegerListNode {
public:
IntrusiveListNode node;
private:
int value;
};
// An example of the how the list would be used.
IntrusiveList<IntegerListNode, &IntegerListNode::node> myList;
リストに保存したいものごとに IntrusiveListNode があります。その IntrusiveListNode を IntegerListNode のように使用できるものに戻すには、クラス内のオフセットに基づいてノードでポインタ演算を行う関数を呼び出し、それを適切な型にキャストします。これは機能しているように見えますが、保証されていないと思います。
使用している型が安全であることをコンパイル時に検証するクラスに static_assert を追加できるようにしたいのですが、static_assert の条件がどうなるかわかりません。これは、IntrusiveListNode を保持する型が標準レイアウト クラスである場合にのみ機能することが保証されていると思いますが、標準レイアウト型の要件は実際に必要以上に厳しいように見えるため、確信が持てません。
特に、標準レイアウト タイプでは、すべてのメンバーが同じアクセス コントロールを持つ必要があります。私が必要としているのは、ポインター演算が機能することを確認できることだけです。つまり、構造体の 2 つの異なるバージョンが異なるレイアウトになる可能性があるため、ポリモーフィック型でこれを使用できないことを意味しますが、型にプライベート データ メンバーとパブリック データ メンバーが混在している場合、これは問題になりませんよね? 型が非ポリモーフィックであることを要求しただけで安全でしょうか? または、行うべきより良いチェックがありますか?それとも、私はis_standard_layout
チェックをしているのですか?