Массивы с любопытно повторяющимся шаблоном? - PullRequest
1 голос
/ 30 сентября 2011

У меня есть оболочка на основе 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.

Есть ли известное решение этой проблемы, или мне просто нужно использовать неидеальныйРешение, упомянутое выше?

1 Ответ

0 голосов
/ 24 декабря 2012

Вы можете смешивать CRTP и полиморфизм.См. https://stackoverflow.com/a/13868014/1902095

Идея состоит в том, чтобы иметь интерфейсный класс BaseHandle, который будет использоваться в качестве полиморфного указателя в рассматриваемом массиве.HandleT<> будет наследовать вышеуказанный класс и реализовывать общие методы (и те методы, которые отличаются на T).

...