从我的阅读中,我了解到可以使用
operator<
或 std::less
来比较 C++ 中的某些指针类型。例如,如果指针用作 std::map
或排序列表中的键,这非常有用。
但是,我很难将指针与成员函数进行比较。
这里有一些示例代码,由于找不到operator<
,所以
无法编译(仅关注指针的比较)。
#include <map>
class Base
{
public:
//...
};
class A : public Base
{
public:
bool a(int v) { return v < 10; }
};
class B : public Base
{
public:
bool b(int v) { return v > 10; }
};
using Fn = bool (Base::*)(int);
int main()
{
A a;
B b;
Fn fn1 = static_cast<Fn>(&A::a);
Fn fn2 = static_cast<Fn>(&B::b);
std::map<Fn, Base*> functions;
functions[fn1] = &a;
functions[fn2] = &b;
return 0;
};
我能够通过使用
operator<
到 reinterpret_cast
来实现 void*
进行编译(尽管有警告)。这迫使编译器执行我想要的操作(因为据我所知,所有指针都以相同的方式实现),但我知道这是一个非常丑陋的解决方案。
有没有办法比较这些指针?
对于那些想了解真正问题上下文的人,这可以在本书中提出的状态图的 C++ 实现中使用:https://www.state-machine.com/doc/PSiCC.pdf。该地图用于存储每个州的“历史”。由于状态是作为成员方法实现的,因此映射会在状态(键)与其历史记录(值)之间创建“映射”。
对象和函数指针应该只是数字。它们是键入的,内置的比较运算符不会强加严格的总顺序。但由于这些东西只是数字,因此预计存在严格的全序,并且您可以通过
std::less
及其同类访问它。
成员指针不仅仅是数字;它还包括成员指针。它们不仅仅是一个地址。因此,它们没有严格的总顺序要求。你也无法制造一个。两个成员指针可以具有相同的值表示(即:单独的位),即使它们“指向”不同的函数,这取决于它们的实现方式。
您的
reinterpret_cast
解决方案不可靠。