c++ - 指向成员的指针集

标签 c++ pointer-to-member

这不起作用:

struct A {
    int x1;
    int x2;
};

int main() {
    int A::*p1 = &A::x1;

    set<int A::*> s;
    s.insert( p1 );  // compile error:  No operator<
    unordered_set<int A::*> us;
    us.insert( p1 ); // compile error:  No hash function 
}

我必须提供比较函数(对于set)或哈希函数(对于unordered_set)。到目前为止,我想到的唯一方法是检查成员指针底层的原始字节:

struct XLess {
    bool operator()( int A::* a, int A::*b ){
        return memcmp( &a, &b, sizeof(a) ) < 0;
    }
};

set<int A::*, XLess> s; // now appears to work

这是创建集合的可靠方法吗?它取决于由相同字节表示的相同指针。有没有更好的解决方案?

最佳答案

从形式上来说,这并不能保证。在实践中,指向成员的指针 数据很可能只是一个简单的整数类型,并且您 应该没有问题。对于指向成员函数的指针, 另一方面:这些通常或多或少复杂 结构,通常会包含填充,其内容是 未定义,所以你的技术不起作用。

我还注意到,在第一个片段中,您使用了 std::unordered_set ,不是std::setstd::unordered_set 不使用排序函数,而是使用等价函数 函数(== 是为指向成员的指针定义的)和 哈希函数。当然,实现哈希函数有 与执行订购时遇到的问题相同。

话虽如此:你到底为什么想要这样一套。 指向成员的指针(例如 int A::* )只能指向成员 给定类型的(不是给定数组的成员) 类型),并且你不可能编写包含数千个的类 成员。最简单的解决方案可能就是使用 std::vector<int A::*> ,和线性搜索( std::find ) 确定成员资格。它可能比任何一个都快 std::set ,除非您确实有数千名成员(member)。

关于c++ - 指向成员的指针集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23675594/

相关文章:

c++ - DDD 调试器 : save A command history between sessions

C++从指向成员函数的指针返回

c++ - 指向成员函数的函数指针

指向对象的 C++ 函数指针

c++ - 模板中的隐式 const 转换

c++ - 是否可以创建一个指向对象的智能指针并将该智能指针作为参数传递给构造函数?

c++ - 允许通过指向方法的成员参数的指针指向的成员类型的模板参数推导

c++ - 指向非法引用的成员的指针?

c++ - 如何在 hpp 中声明一个 vector ?

C++ 链表指针指向结构崩溃