2

C++/C++11 では、ネストされたクラスのインスタンス化の「所有者」への参照/ポインターを取得するにはどうすればよいですか? 例えば:

class A
{
public:
    friend class B;
    class B
    {
    public:
        Foo bar(int i) { return get_owner().x[...]; }

    private:
        A& get_owner()
        { // How to do this? Pseudo code:
            return (A*)(this - offsetof(A, b));
        }
    };

    B b;
};

注: 私の場合、 A はプライベート メンバー変数とパブリック メンバー変数があるため、標準のレイアウト タイプではありません。

背景: 所有クラスのデータ構造にアクセスし、A のユーザーがたとえば

A a;
...
x = a.nodes[5];
y = a.nodes.size();
for (auto n: a.nodes)  // using a.nodes.begin() and a.nodes.end()
    ...

注 2: 私はおそらく汚いトリックを使用してこれを行うことができますが、これを行うためのポータブルで標準に準拠した方法はありますか?
そうでない場合は、"a.nodes(5)" と "for (auto n: a.nodes())" を記述できるように B を実装する必要がありますが、これは見栄えが悪くなります。

編集:BにAへの参照を与えることはすでに考えていましたが、Aにデフォルトのコピー/移動コンストラクター/代入演算子を使用できませんでした。これは私の場合はそれほど悪くはありませんが、別の解決策。

4

2 に答える 2

3

B所有者を指すメンバーを に追加します。

于 2013-09-02T11:38:36.407 に答える