如何实现成员方法指针的比较/较少运算符?

问题描述 投票:0回答:1

从我的阅读中,我了解到可以使用

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。该地图用于存储每个州的“历史”。由于状态是作为成员方法实现的,因此映射会在状态(键)与其历史记录(值)之间创建“映射”。

c++ pointers c++17 operator-overloading function-pointers
1个回答
0
投票

对象和函数指针应该只是数字。它们是键入的,内置的比较运算符不会强加严格的总顺序。但由于这些东西只是数字,因此预计存在严格的全序,并且您可以通过

std::less
及其同类访问它。

成员指针不仅仅是数字;它还包括成员指针。它们不仅仅是一个地址。因此,它们没有严格的总顺序要求。你也无法制造一个。两个成员指针可以具有相同的值表示(即:单独的位),即使它们“指向”不同的函数,这取决于它们的实现方式。

您的

reinterpret_cast
解决方案不可靠。

© www.soinside.com 2019 - 2024. All rights reserved.