C++ 11 获取 std::function 的指针

标签 c++ c++11

我想在 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::functionstd::move 下移动类似的操作。这真是一团糟。

关于C++ 11 获取 std::function 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42136260/

相关文章:

c++ - Qt QDialog 和 GNOME 3,如何显示关闭按钮/标题栏并使其可移动?

c++ - 将运行时类型映射到并行类层次结构......使用模板

c++ - 按第一个容器的元素对两个容器进行同步排序

c++ - static constexpr 类成员变量对多线程读取安全吗?

C++:对用户隐藏类构造

c++ - OpenGL:纹理坐标实时变化的地形的最佳渲染方法?

C++ 静态计数器没有正确增加

c++ - 使用自定义比较器返回 std::set

visual-c++ - Visual Studio 2013 std::mutex 和可怕的 Windows 加载器锁

c++11 - 嵌套列表初始化如何转发其参数?