C ++ указатели членов constexpr в классах

Я пытаюсь использовать класс для группировки всех параметров структуры данных шаблона, в частности, навязчивого дерева 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);

Есть ли способ сделать это без такого лишенного информации стандартного кода или чего-то другого, что позволяет достичь тех же целей группирования параметров (то есть не просто передать все элементы в качестве параметров шаблона)?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …