【问题标题】:How do I get the address of a c-style function stored in an std::function?如何获取存储在 std::function 中的 c 风格函数的地址?
【发布时间】:2015-03-04 11:14:25
【问题描述】:

出于调试目的,我想打印存储在我的 std::function 中的函数指针的地址。我可以保证 std::function 将指向 c 风格的函数或 lambda。有没有办法做到这一点?

否则我将不得不在添加函数指针时将其存储在内存中并修改所有 lambdas。

我尝试在这里使用答案https://stackoverflow.com/a/18422878/274249,但它似乎不起作用。

一些示例代码:

std::function<void()> func = commands.front();
void * fp = get_fn_ptr<0>(func);
void * bb = &glBindBuffer;
printf("bb is %x\n", bb); // Outputs 5503dfe0
printf("fp is %x\n", fp); // Should be the same as above, but outputs 4f9680

【问题讨论】:

  • target&lt;&gt;() 成员不适合您?
  • 我想知道,但它似乎总是返回 null: "typedef void (*glBindBufferfp)(GLenum target, GLuint buffer); void * adsf = func.target();"注意我使用的是视觉工作室。

标签: c++ c++11 lambda stl


【解决方案1】:

您的版本不起作用,因为您链接到的答案是提供一个函数包装器,以提供一个您可以使用的独立版本,无论源是函子、函数指针还是 std::function

在你的情况下,你可以使用std::functiontarget函数:

void foo(){}

std::function<void()> f = foo;
auto fp = *f.target<void(*)()>();
auto bb = &foo;
printf("bb is %x\n", bb);
printf("fp is %x\n", fp);

输出:

bb is 80487e0
fp is 80487e0

【讨论】:

  • 确实有效,但我正在使用 std::bind(glBindBuffers, x, y) 并且 target() 似乎返回 null 到我传递的任何内容: typedef void(*glBindBufferfp)(GLenum target , 胶水缓冲液); std::function f = std::bind(glBindBuffer, 1, 1);自动 fp = *f.target();自动 bb = &glBindBuffer;
  • 很遗憾,std::bind 的类型未指定,不会转换为函数指针供您打印。
  • 我明白了,所以我将不得不修改一些东西以在源处传递函数指针。谢谢
  • 我对这个问题的所有答案感到困惑。什么是 void(*)(),它与 ​​void() 有什么关系?我的问题涉及具有返回类型和参数的函数,我不知道如何将此解决方案应用于我的问题。
  • @WillyGoat void() 是不带参数且不返回任何内容的函数类型,void(*)() 是指向此类函数的指针。
猜你喜欢
  • 2023-03-23
  • 2011-06-13
  • 2010-12-08
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多