【问题标题】:Linking two function pointers链接两个函数指针
【发布时间】:2015-08-28 05:35:20
【问题描述】:

我有一个函数指针向量 (void (*)()),表示您已经采取的操作列表。怎样才能把最后两个弹出来,变成一个函数指针,然后放回列表中呢?

例子:

void link_last_two(std::vector<void (*)()> actions) {
    if(actions.size() <= 1) return;
    void (*first)() = actions.back();
    actions.pop_back();
    void (*second)() = actions.back();
    actions.push_back([](){first(); second();});
}

【问题讨论】:

  • 使用std::function 代替原始函数指针。
  • 您可以使用 hackish 解决方案来做到这一点。如果您可以控制代码,请改用std::function,正如@BasileStarynkevitch 所建议的那样。
  • 函数指针只是一个指针——一个函数机器码所在的内存地址。 “first”指向某个地址,“second”指向某个地址;您希望新函数指向哪个地址?没有要指向的现有函数,而且您可能不会询问为新函数生成机器代码并指向它。这就是为什么你应该使用其他东西来描述函数而不是指针。 std::function 是一个不错的选择。
  • @BasileStarynkevitch 这不是非常慢吗?我可以更改源(我还没有编码)

标签: c++ c++11 function-pointers


【解决方案1】:

使用void(*)(),你不能。这只是没有任何上下文的事实的结果。你可以创建一个函数void helper() 并存储一个指向它的指针,但是helper 怎么知道要调用哪两个函数呢?

如前所述,std::function&lt;void(void)&gt; 确实具有所需的上下文。或者,存储一个列表

std::pair<void*, union {
   void(*)(void) no_context;
   void(*)(void*) context;
  }>

如果第一个void*nullptr,则调用no_context 函数,否则调用context 函数传递非空void* 指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-02
    • 2014-10-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    相关资源
    最近更新 更多