如何在 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 本身是不必要的。你不妨使用一个免费的功能。
我有一个 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 本身是不必要的。你不妨使用一个免费的功能。