2015-08-28 54 views
0

我有一个函数指针向量(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();}); 
} 
+7

使用'std :: function'而不是原始函数指针。 –

+0

你可以使用一个黑客解决方案。如果您可以控制代码,请使用'std :: function',正如@BasileStarynkevitch所建议的。 –

+2

函数指针只是一个指针 - 函数机器码所在的内存地址。 “第一”指向某个地址,“第二”指向某个地址;您希望新功能指向哪个地址?没有现有的功能可以指向,而且您可能不会为生成新的函数生成机器代码并指出这一点。这就是为什么你应该使用别的东西来描述函数而不是指针。 std :: function是一个不错的选择。 – jkff

回答

0

随着void(*)(),你不能。这仅仅是没有任何背景的事实的结果。您可以创建一个函数void helper()并存储一个指针,但helper将如何知道要调用哪两个函数?

如上所述,std::function<void(void)>具有所需的上下文。另外,存储

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

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