这不起作用:
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::set
。 std::unordered_set
不使用排序函数,而是使用等价函数
函数(==
是为指向成员的指针定义的)和
哈希函数。当然,实现哈希函数有
与执行订购时遇到的问题相同。
话虽如此:你到底为什么想要这样一套。
指向成员的指针(例如 int A::*
)只能指向成员
给定类型的(不是给定数组的成员)
类型),并且你不可能编写包含数千个的类
成员。最简单的解决方案可能就是使用
std::vector<int A::*>
,和线性搜索( std::find
)
确定成员资格。它可能比任何一个都快
std::set
,除非您确实有数千名成员(member)。
关于c++ - 指向成员的指针集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23675594/