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



我有一个与类相关的比较/排序函数。如果我将它定义为一个单独的闭包对象,我就可以使用它。我想把它变成它操作的类的静态方法,这样它就更整洁了。我猜怎么做,但我得到了一个我无法解释的错误。

一般来说,我想知道如何将静态方法视为可调用对象。

最小相关示例代码(不起作用(:

#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是私有的,请将其公开
  • 必须使用&才能获得函数的地址
#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个字节。它还强制您将函数传递给集合的构造函数。

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

如果您确实想要一个指针,那么类本身是不必要的。你还不如使用一个免费函数。

最新更新