2015-08-28 55 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*指針。