Имитация делегатов C# в стандартном C++ - Использование кода

ОГЛАВЛЕНИЕ

Использование кода

Чтобы испытать код, загрузите его демонстрационную версию. Все содержится в одном файле. Скомпилируйте его и запустите из командной строки. Этот код был разработан в 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>