2012-12-10 51 views
0

我想從C++調用C API。 API需要一個函數指針,但對我來說,功能是在C++函數對象中實現的,因爲它具有狀態。當API要求函數指針時使用函數對象

實際上,所需的功能被分成兩個功能對象。 C api需要一個函數,它有兩個指針參數用於返回每個函數對象返回的兩件事情。

除了定義一個全局函數,還有什麼方法可以使用C中的函數對象。例如,是否可以將它重新解釋爲函數指針?

EDITS:

爲了簡化其確定的假設,回叫的簽名是無效(*f)(void*, int*, int*)

哦,它必須是C++ - 03

+0

也許傳遞一個lambda函數? – Cornstalks

+2

函數指針對C api所需的函數簽名是什麼? – phonetagger

+0

@phonetagger爲了簡單起見,假設(void *,int *,int *)void *會傳遞一些狀態信息。 – san

回答

3

大多數API允許通過一些通過void指針沿用戶狀態。您可以通過有一個指針傳遞給你的對象:

struct my_obj 
{ 
    void operator()(int*, int*) {} 

    static void forwarder(void *state, int *x, int *y) { (*(my_obj*)state)(x, y); } 
}; 

void install_fn(void (*)(void*,int*,int*), void *state); 

my_obj obj; 
install_fn(my_obj::forwarder, &obj); 

原料藥不容許你傳遞任何狀態(GLUT是唯一的我發現,浮現在腦海中的一個),你」退出(便攜)運氣。

+1

當API不直接支持傳遞狀態信息時,它仍然可以完成。其中一種方法是簡單的舊的全球變量。如果涉及線程,那麼需要踩下本地存儲器。另一種方法是將信息與一些可用的數據相關聯,例如,一個Windows窗口屬性。第三種是使用機器碼級蹦牀功能,在飛行中生成。這被Borland的GUI框架所使用,它是最有效和最安全的,但可能與今天的「安全」措施有點不兼容。 –

+0

我會發表一個答案,除了OP對具體案例過於含糊之外。 :-( –

+0

)不完全是出於便攜式的運氣......我已經看到了通過這樣的api使用具有固定大小的靜態蹦牀函數的外觀的界面,以及指向這些蹦牀的靜態空閒列表指針(在編譯器/目標文件的意義上不是蹦牀)。當通過api註冊一個函數時,它會註冊下一個免費的蹦牀並從空閒列表中取出它,並且當被回叫時,它會自動回到空閒狀態列表,直到它用完蹦牀,在這種情況下,它會炸燬...但它從來沒有。 – phonetagger