Имитация делегатов C# в стандартном C++ - Использование кода
ОГЛАВЛЕНИЕ
Страница 3 из 3
Использование кода
Чтобы испытать код, загрузите его демонстрационную версию. Все содержится в одном файле. Скомпилируйте его и запустите из командной строки. Этот код был разработан в g++ 3.2. Мы бы хотели знать, в каких других компиляторах он будет работать, а в каких нет, поэтому просим сообщать нам.
struct TShapes
{
virtual void Square(int i)
{ std::cout << "TShapes::Square: " << i << std::endl; }
void Triangle(int i)
{ std::cout << "TShapes::Triangle: " << i << std::endl; }
};
struct TDerivedShapes : TShapes
{
virtual void Square(int i)
{ std::cout << "TDerivedShapes::Square: " << i << std::endl; }
};
struct TThings
{
void Thing1(int i)
{ std::cout << "TThings::Thing1: " << i << std::endl; }
static void Thing2(int i)
{ std::cout << "TThings::Thing2: " << i << std::endl; }
};
void Free(int i)
{ std::cout << "Free: " << i << std::endl; }
int main()
{
// Как обычно, typedef облегчает использование шаблонов.
typedef Event<void, int> MyEvent;
MyEvent event;
TShapes shapes;
TDerivedShapes shapes2;
TThings things;
// Эти элементы заставят шар крутиться.
event += new MyEvent::T<TShapes>(&shapes, &TShapes::Square);
event += new MyEvent::T<TShapes>(&shapes, &TShapes::Triangle);
// Этот элемент показывает, что виртуальные функции обрабатываются правильно.
event += new MyEvent::T<TShapes>((TShapes*)&shapes2, &TShapes::Square);
// Этот элемент показывает, что унаследованные функции обрабатываются правильно.
event += new MyEvent::T<TDerivedShapes>(
&shapes2, &TDerivedShapes::Triangle);
// Этот элемент показывает, что объект События
// может хранить разнородную
// коллекцию целей.
event += new MyEvent::T<TThings>(&things, &TThings::Thing1);
// Этот элемент показывает, что статические функции обрабатываются правильно.
event += new MyEvent::S(&TThings::Thing2);
// Этот элемент показывает, что свободные функции обрабатываются правильно.
event += new MyEvent::S(&Free);
// Вызов события с многократным приведением
std::cout << "<multicast>" << std::endl;
event(100);
std::cout << "</multicast>" << std::endl;
return 0;
}
Вот что вы должны увидеть при запуске программы:
<multicast>
TShapes::Square: 100
TShapes::Triangle: 100
TDerivedShapes::Square: 100
TShapes::Triangle: 100
TThings::Thing1: 100
TThings::Thing2: 100
Free: 100
</multicast>