Są wakacje, dłuuuuugie wakacje, bo jestem po maturze i zaczynam studiować dopiero w październiku, dlatego dla zabicia nudy próbuję sobie napisać własną okrojoną obiektową wersję WinAPI na wzór Windows Forms z .NET(tak wiem, że są MFC, ale mówię, ma to na celu zabicie nudy oraz podszkolenie się w C++, może kiedyś uda mi się stworzyć grę i użyć mojej biblioteczki przy tworzeniu okna :D). Mam jednak dylemat, zaimplementowałem już zdarzenia (podobne do tych z C#, jednak bardziej ograniczone - stała liczba argumentów funkcji: pierwszy to wskaźnik na obiekt wywołujący, drugi to dowolny typ, jednak z założenia mają to być informacje o zdarzeniu) za pomocą szablonu klasy WindowEvent:
template
class WindowEvent
{
public:
void operator()(void* sender, EventArgsType args);
void operator+=(void (*) (void*,EventArgsType));
private:
std::vector functions; //przechowuje wskazniki funkcji, które maja byc wywoływane za pomoca operatora ()
};
template
void WindowEvent::operator()(void* sender, EventArgsType args)
{
for(unsigned int register i=0;i
{
functions[i](sender,args);
}
}
template
void WindowEvent::operator+=(void (*function)(void* sender, EventArgsType args))
{
functions.push_back(function);
}
Niby wszystko jest OK, ale problem pojawia się kiedy wywołuje dane zdarzenie, bo muszę sprawdzić czy np zdarzenie WindowEvent onClose ma “w środku jakieś wskaźniki na funkcje”, inaczej musze wywołać funkcje DefWindowProc. Pojawiła mi się myśl, że mógłbym zgłaszać wyjątki w momencie kiedy vector functions jest pusty, jednak czy jest to dobre rozwiązanie? Bo kiedy większość zdarzeń będzie pusta, to przy przetwarzaniu wiadomości okna, będzie zgłaszanych mnóstwo wyjątków, czy wpłynie to drastycznie na wydajność? Oczywiśie istnieje inne rozwiązanie - publiczna metoda bool isEmpty(), którą trzeba wywołać przed wywołaniem operatora(), ale przecież wyjątki mają być mechanizmem, który ma zlikwidować takie właśnie sprawdzanie. Więc co myślicie?