如何在 C++ 中使用静态方法作为回调

How to use a static method as a callback in c++

我有一个 comparison/ordering 函数与 class 相关。如果我将它定义为一个单独的闭包对象,我就可以使用它。我想把它变成它运行的 class 的静态方法,这样它就更整洁了。我猜到了如何执行此操作,但出现无法解释的错误。

通常我想知道如何将静态方法视为可调用对象。

最少的相关示例代码(不工作):

#include <set>

class MyClass {

    // More code here

    static auto compare(MyClass a, MyClass b)   {
        return a < b;
    }
};

int main() {
    std::set<MyClass, decltype(MyClass::compare)> s(MyClass::compare);
    return 0;
}

更新,我不确定我的示例是否混淆了问题,所以我更新了它。

几个问题:

  • compare是私有的,设为public.
  • 必须使用&获取函数地址。
#include <set>

class MyClass {
public:
    static auto compare(int a, int b)   {
        return a < b;
    }
};

int main() {
    std::set<int, decltype(&MyClass::compare)> s(&MyClass::compare);
    return 0;
}

创建函数public,并在decltype中添加&:

std::set<int, decltype(&MyClass::compare)>

虽然我不认为这更“整洁”。

函子用作std::set比较器时占用0字节。但是函数指针(如您的示例)占用 4 或 8 个字节。它还会强制您将函数传递给集合的构造函数。

仅当您想在运行时在不同的比较器之间切换时,以这种方式使用函数指针才有意义。

如果您确实需要指针,则 class 本身是不必要的。你不妨使用一个免费的功能。