3

クラスを使用して、テンプレートデータ構造のすべてのパラメーター、特に侵入型AVLツリーをグループ化しようとしています。ユーザーは次のようなことをします。

struct MyEntry {
    MyEntry *parent;
    MyEntry *child[2];
    int balance;
    int value;
};

struct MyAvlTreeParams {
    typedef MyEntry entry_type;
    static constexpr auto parent_member = &MyEntry::parent;
    static constexpr auto child_member = &MyEntry::child;
    static constexpr auto balance_member = &MyEntry::balance;
    ... // comparators also come here which compare MyEntry::value
};

AvlTree<MyAvlTreeParams> tree;
MyEntry entry1, entry2;
entry1.value = 6;
entry2.value = 8;
tree.insert(&entry1);
tree.insert(&entry2);

しかし、MyAvlTreeParamsのメンバーポインタに問題があります。このサンプルはそれを示しています:

struct A {
    int x;
};

struct B {
    static constexpr auto member = &A::x;
};

int main ()
{
    A a;
    (a.*(B::member)) = 6;
    return 0;
}

これはclang++3.1で機能しますが、g++4.7.2は次のエラーでリンクできません。

/tmp/ccGXGIOl.o:a.cpp:function main: error: undefined reference to 'B::member'

エラーは、構造体Bの定義のどこかに次の宣言を追加することで修正されます(この質問を参照)。

constexpr int (A::*(B::member));

私の場合、これがどのように問題になるかを確認するには、AVLツリーを使用するたびに次のすべてを追加する必要があります。

constexpr MyEntry * MyEntry::*(MyAvlTreeParams::parent_member);
constexpr MyEntry * (MyEntry::*(MyAvlTreeParams::child_member))[2];
constexpr int MyEntry::*(MyAvlTreeParams::balance_member);

このような情報のないボイラープレートコードなしでこれを行う方法はありますか、またはパラメーターをグループ化するという同じ目標を達成する別の方法がありますか(つまり、すべてのメンバーをテンプレートパラメーターとして渡すだけではありません)?

4

0 に答える 0