我正在尝试使用一个类来对模板数据结构的所有参数进行分组,特别是一个侵入式 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);
如果没有这种信息较少的样板代码,或者有什么不同的方法可以实现分组参数的相同目标(即不仅仅是将所有成员作为模板参数传递),是否有任何方法可以做到这一点?