比较成员函数的 std::function
Comparing std::function for member functions
我试图搜索并在这里找到类似的问题:
question 1
question 2
但是不管怎样,我无法比较成员函数。这是一个例子:
class ClassA
{
public:
int add(int a, int b)
{
return a + b;
}
};
int main()
{
ClassA a1{};
function<int(int, int)> f1 = bind(&ClassA::add, a1, placeholders::_1, placeholders::_2);
function<int(int, int)> f2 = bind(&ClassA::add, a1, placeholders::_1, placeholders::_2);
cout << boolalpha << "f1 == f2 " << (f1.target_type() == f2.target_type()) << endl; // true
cout << (f1.target<int(ClassA::*)(int, int)>() == nullptr) << endl; // true
return 0;
}
从代码中可以明显看出 f1 和 f2 是不同的。第一个cout显示true因为类型一样,没问题。但为什么第二个 cout 是 true?为什么 function::target() returns nullptr?
P.S.: 我想创建一个简单的委托系统,这样我就可以传递任何函数(全局、静态、成员)。使用 std::function 我可以添加回调,但我不知道如何删除它。
那些 std::function
不包含成员函数。它们包含 bind
个结果类型。由于 bind
是相同的类型模式,因此 bind
结果类型相同。
那是因为f1
的目标类型不是int(ClassA::*)(int, int)
。它的目标类型将是 bind
表达式的结果,在 gcc 上恰好是:
std::_Bind<std::_Mem_fn<int (ClassA::*)(int, int)> (
ClassA,
std::_Placeholder<1>,
std::_Placeholder<2>)>
您可以使用 ABI demangler 查看:
#include <cxxabi.h>
// note, the following line technically leaks, but
// for illustrative purposes only it's fine
cout << abi::__cxa_demangle(f1.target_type().name(), 0, 0, 0) << endl;
请注意,如果目标类型实际上是一个 class 方法,您将无法使用两个 int
调用它 - 您还需要 ClassA*
.例如,this 函数的目标类型是 int(ClassA::*)(int, int)
:
function<int(ClassA*, int, int)> f3 = &ClassA::add;
我试图搜索并在这里找到类似的问题:
question 1
question 2
但是不管怎样,我无法比较成员函数。这是一个例子:
class ClassA
{
public:
int add(int a, int b)
{
return a + b;
}
};
int main()
{
ClassA a1{};
function<int(int, int)> f1 = bind(&ClassA::add, a1, placeholders::_1, placeholders::_2);
function<int(int, int)> f2 = bind(&ClassA::add, a1, placeholders::_1, placeholders::_2);
cout << boolalpha << "f1 == f2 " << (f1.target_type() == f2.target_type()) << endl; // true
cout << (f1.target<int(ClassA::*)(int, int)>() == nullptr) << endl; // true
return 0;
}
从代码中可以明显看出 f1 和 f2 是不同的。第一个cout显示true因为类型一样,没问题。但为什么第二个 cout 是 true?为什么 function::target() returns nullptr?
P.S.: 我想创建一个简单的委托系统,这样我就可以传递任何函数(全局、静态、成员)。使用 std::function 我可以添加回调,但我不知道如何删除它。
那些 std::function
不包含成员函数。它们包含 bind
个结果类型。由于 bind
是相同的类型模式,因此 bind
结果类型相同。
那是因为f1
的目标类型不是int(ClassA::*)(int, int)
。它的目标类型将是 bind
表达式的结果,在 gcc 上恰好是:
std::_Bind<std::_Mem_fn<int (ClassA::*)(int, int)> (
ClassA,
std::_Placeholder<1>,
std::_Placeholder<2>)>
您可以使用 ABI demangler 查看:
#include <cxxabi.h>
// note, the following line technically leaks, but
// for illustrative purposes only it's fine
cout << abi::__cxa_demangle(f1.target_type().name(), 0, 0, 0) << endl;
请注意,如果目标类型实际上是一个 class 方法,您将无法使用两个 int
调用它 - 您还需要 ClassA*
.例如,this 函数的目标类型是 int(ClassA::*)(int, int)
:
function<int(ClassA*, int, int)> f3 = &ClassA::add;