2011-09-30 114 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不同的方法)。