Передача указателя на не статический метод класса.

 

В mql можно передать указатель на статический метод:

typedef bool (*Callback)    (int a, double b, char c);

class SomeClass
{
public:
  static bool some_function(int a, double b, char c);
};

class OtherClass
{
  void set_callback(Callback callback) { _callback = callback; }
  void execute_callback() { _callback(1, 2., "a"); }
private:
  Callback _callback;
};

Однако, для не статических методов, такого сделать нельзя. На C++ это можно сделать через std::function и placeholders с передачей указателя на объект. Можно ли это как то реализовать на mql5?

Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Статические члены класса
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Статические члены класса
  • www.mql5.com
Статические члены класса - Объектно-ориентированное программирование - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Выкручивался только в случае, когда надо было передать указатель на один и тот же метод элементов массива. В общем случае не делал.
 
fxsaber #:
Выкручивался только в случае, когда надо было передать указатель на один и тот же метод элементов массива. В общем случае не делал.

Можно поподробнее...

 
DrSky #:

Можно поподробнее...

#include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/ru/code/22577

class SYSTEM
{
public:
  virtual void OnTick() {} // указатель на этот метод нужно передавать.
};

class SYSTEMS
{
  static int SystemPos;
  static SYSTEM* Systems[]; // Массив ТС

public:
  static void AllTicks()  
  {    
    // Прогнали все ТС.
    for (SYSTEMS::SystemPos = ::ArraySize(SYSTEMS::Systems); (bool)SYSTEMS::SystemPos--;)
      VIRTUAL::NewTick(SYSTEMS::SystemTick);
  }
  
  // Костыль.
  static void SystemTick()
  {
    SYSTEMS::Systems[SYSTEMS::SystemPos].OnTick();
  }
};

static SYSTEM* SYSTEMS::Systems[];
static int SYSTEMS::SystemPos = 0;
 
fxsaber #:

Не совсем то, но спасибо...

 

Нашел способ сделать следующим образом:

input int value = 10;

class SomeClass
{
public:
  SomeClass() {}
  
  void print_int(int i) { Print(i); }
};

class Wrapper
{
public:
  Wrapper() {}
  
  void set_object_pointer(void* pointer) { _pointer = pointer; }
  void execute_callback() 
  { 
    SomeClass* some_obj = _pointer; 
    some_obj.print_int(value); 
  }
private:
  void* _pointer;
};

void OnStart()
{    
  SomeClass some_class;
  
  Wrapper wrapper;
  
  wrapper.set_object_pointer(&some_class);  
  wrapper.execute_callback();
}
 
Теперь можно при работе с указателями на классы не использовать template - void*?
 
fxsaber #:
Теперь можно при работе с указателями на классы не использовать template - void*?

Почему теперь? void* в MQL если не всегда были, то по крайней мере задолго до появления template. Помню еще первый в CodeBase более-менее грамотный код уже тогда с void* был

 
A100 #:

Почему теперь? void* в MQL если не всегда были, то по крайней мере задолго до появления template. Помню еще первый в CodeBase более-менее грамотный код уже тогда с void* был

Понял, спасибо.

Причина обращения: