我有一個Visual Studio 2008 C++項目,我用C接口創建一個DLL。我定義了兩種類型的回調函數:常規函數和擴展函數提供附加數據。切片DLL句柄類
struct Foo {
char a[ MAX_A ];
char b[ MAX_B ];
char c[ MAX_C ];
};
struct FooEx {
char a[ MAX_A ];
char b[ MAX_B ];
char c[ MAX_C ];
char d[ MAX_D ];
};
typedef void (CALLBACK *USERCALLBACK)(const Foo&, DWORD);
typedef void (CALLBACK *USERCALLBACK_EX)(const FooEx&, DWORD);
我使用UserData
結構維護狀態。因爲我有兩個類型的回調,我結束了兩種結構:
struct UserData {
DWORD user;
int zoo;
std::string bar;
USERCALLBACK callback;
};
struct UserDataEx {
DWORD user;
int zoo;
std::string bar;
USERCALLBACK_EX callback;
};
如何調和我的API具有兩種不同UserData
結構,而無需創建每個功能的獨立EX版本?有沒有一種方法來模擬回調?或者創建一個基類的用戶數據?
DECLARE_HANDLE(HMYAPI);
// this function is agnostic of the callback type
MY_API HMYAPI MyAPI_Create()
{
return (HMYAPI)new UserData();
}
// This function does not directly use the callback type, but may need to know it to properly deallocate the UserData structure.
MY_API void MyAPI_Close(HMYAPI handle)
{
delete reinterpret_cast< UserData* >(handle);
}
// this function needs to know about the different callback types
MY_API void MyAPI_Register(HMYAPI handle, USERCALLBACK cb, DWORD user)
{
UserData* ud = reinterpret_cast< UserData* >(handle);
ud->cb = cb;
ud->user = user
}
// this function needs to know about the different callback types
MY_API void MyAPI_RegisterEX(HMYAPI handle, USERCALLBACK_EX cb, DWORD user)
{
UserData* ud = reinterpret_cast< UserData* >(handle);
ud->cb = cb;
ud->user = user
}
// this function is agnostic of the callback type
MY_API void Foo(HMYAPI handle, int x)
{
UserData* ud = reinterpret_cast< UserData* >(handle);
ud->bar = "Foo";
ud->zoo = x;
}
http://www.partow.net/programming/templatecallback/index.html#VariableArgumentDerivative – Flot2011 2012-03-16 20:39:32