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