类中的 C++ constexpr 成员指针

C++ constexpr member pointers in classes

提问人:Ambroz Bizjak 提问时间:10/2/2012 最后编辑:CommunityAmbroz Bizjak 更新时间:10/2/2012 访问量:1174

问:

我正在尝试使用一个类来对模板数据结构的所有参数进行分组,特别是侵入式 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);

有没有办法在没有这种无信息的样板代码的情况下做到这一点,或者没有其他的东西来实现对参数进行分组的相同目标(即不仅仅是将所有成员作为模板参数传递)?

C++ undefined-reference constexpr 成员指针

评论

0赞 Ambroz Bizjak 10/2/2012
它会的。这是一个成员指针(我猜查一下?不需要 A 的实例来获取 &A::x。
0赞 Ambroz Bizjak 10/2/2012
@JoachimPileborg例如 stackoverflow.com/questions/670734/...
0赞 Some programmer dude 10/2/2012
是的,当然,似乎我的大脑在上周左右忘记了这一点。

答: 暂无答案