2011-09-30 78 views
1

我有一個基於CRTP,包裝爲Windows HANDLE奇怪的循環模板模式?

#include <windows.h> 

template<class T> 
class HandleT 
{ 
    HANDLE handle; 

    operator HANDLE() const { return this->handle; } 

    static ULONG WaitForMultipleObjects(DWORD count, /* ??? */ objects[]) 
    { 
     return WaitForMultipleObjects(count, ...); 
    } 
}; 

class EventHandle : Handle<EventHandle> 
{ 
    //... 
}; 

class FileHandle : Handle<FileHandle> 
{ 
    //... 
}; 

我遇到的問題是,我不知道什麼來取代上述???。我不能說HandleT<T>,因爲它們可以是不同類型的手柄,它們不適合數組。我不想說HANDLE,因爲那麼這個函數根本就不會在HandleT對象上工作 - 用戶可能會避免完全調用封裝器。而且我不能使用可變模板,因爲我仍然處於C++ 0x之前的世界。

是否有已知的解決方案來解決這個問題,還是我只需要使用上面提到的非理想解決方案?

+0

T在哪裏使用類? – JohnPS

+0

@JohnPS:它被用於處理句柄管理的代碼部分(即關閉它等)......我沒有複製那部分,因爲它看起來不太相關。 – Mehrdad

+0

'object []'數組是否存在混合類型?如果是的話,那麼看起來你需要規則多態而不是CRTP。如果每次對'WaitForMultipleObjects'的調用都獲得一個相同類型的數組,那麼你可以創建一個模板函數。 – JohnPS

回答

0

您可能混用CRTP和多態性。見https://stackoverflow.com/a/13868014/1902095

這個想法是有一個接口類,BaseHandle,它將被用作有問題的數組內的多態指針。 HandleT<>將繼承上述類並實現常用方法(以及那些與T不同的方法)。