我想在 std::map
中存储和识别 std::function
对象。
为了确定我想使用std::function::target
。
如果我使用 std::bind
绑定(bind)到类中的成员函数,我无法从 std::function::target
获取指针。
#include <functional>
#include <iostream>
using namespace std;
void normal_fun(int a)
{
std::cout << "hello\n"<<a;
}
class testclass
{
public:
int b;
void mytest(int a)
{
b = a;
}
};
uintptr_t getFuncAddress(std::function<void(int)> &f)
{
uintptr_t returnAddress = reinterpret_cast<uintptr_t>(f.target<void(*)(int)>());
return returnAddress;
}
int main()
{
testclass c;
std::function<void(int)> f1 = bind(&testclass::mytest,&c, placeholders::_1);
std::function<void(int)> f2 = normal_fun;
auto addrF1 = getFuncAddress(f1);
auto addrF2 = getFuncAddress(f2);
}
我怎样才能实现我想做的事情?
最佳答案
一个std::function
不是函数指针。它甚至不是一个指针。
如果您知道 std::function
中存储的是什么类型,您可以获得指向它存储的内容的指针。注意,这里的指针不是函数指针,而是指向函数指针的指针。
如果您不知道它存储的类型,您就不能。
如果你想要<
或==
或hash
(等),std::function
不为您提供此服务。它键入删除 ()
、复制、移动、销毁、typeid 和转换回原始。
您可以使用类型删除技术来增强 std::function
与这些操作;请注意,二元运算上的类型删除比一般类型删除要复杂一些。
在解决问题时,键入删除某些内容不应该是您的首要选择,但它会解决您的问题。 C++ 的 SO 文档中有关于类型删除的文章。这不是一个初学者主题。
很可能您的根本问题可以通过更简单的方式解决。
无论如何,使用从 target
返回的类型to order 并不是一个好主意,因为它是指向可能的自动存储对象或可能的堆存储对象的指针;在无害操作(如移动)下,这两者将具有显着不同的失效规则。 SBO(小缓冲区优化)目标将随 std::function
的实例一起移动,而堆分配的可能会保持状态 std::function
在 std::move
下移动类似的操作。这真是一团糟。
关于C++ 11 获取 std::function 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42136260/