我想存储和识别std::function
中的对象std::map
。
为了识别我想使用std::function::target
。
我无法从中获取指针std::function::target
如果我使用std::bind
绑定到类的成员函数。
#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);
}
我怎样才能实现我想做的事?
A std::function
不是函数指针。它甚至不是一个指针。
如果您知道 a 中存储的是什么类型std::function
,您可以获得指向它存储的内容的指针。注意,这里的指针不是函数指针,而是指向函数指针的指针。
如果您不知道它存储什么类型,则不能。
如果你想<
or ==
or hash
(etc), std::function
不为您提供这个。它键入擦除()
、复制、移动、销毁、typeid 和转换回原始状态。
您可以使用类型擦除技术来增强std::function
与这些操作;请注意,二元运算上的类型擦除比一般类型擦除更棘手。
解决问题时,键入擦除内容不应该是您的首要选择,但它会解决您的问题。 C++ 的 SO 文档中有关于类型擦除的文章。这不是一个初学者主题。
您的根本问题很可能可以通过更简单的方式得到解决。
无论如何,使用从返回的类型target
to order 并不是一个好主意,因为它是指向可能的自动存储对象或可能的堆存储对象的指针;在无害操作(如移动)下,这两者将具有显着不同的失效规则。 SBO(小缓冲区优化)目标将随着实例的变化而移动std::function
,而堆分配的可能会保留在状态中std::function
在下面移动std::move
类似的操作。这真是一团糟。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)