提问人:Ambroz Bizjak 提问时间:10/2/2012 最后编辑:CommunityAmbroz Bizjak 更新时间:10/2/2012 访问量:1174
类中的 C++ constexpr 成员指针
C++ constexpr member pointers in classes
问:
我正在尝试使用一个类来对模板数据结构的所有参数进行分组,特别是侵入式 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);
有没有办法在没有这种无信息的样板代码的情况下做到这一点,或者没有其他的东西来实现对参数进行分组的相同目标(即不仅仅是将所有成员作为模板参数传递)?
答: 暂无答案
评论