Inny niż klasyczny sposób uruchomienia kodu

0

Dzisiaj napisałem ciekawe makra, może komuś się przydadzą.

Przykład użycia:

#include <iostream>
#include <map>

using namespace std;

#define CONCAT_DETAIL(a, b) a##b
#define CONCAT(a, b) CONCAT_DETAIL(a, b)
#define UNIQUENAME CONCAT(__unique_name__, __COUNTER__)

#define CALLINGSTRUCT(cmd,name) \
    struct name { static int a; static int call() {{cmd} return 0;} }; int name::a = name::call();

#define CALLOUTSIDE(cmd) \
    CALLINGSTRUCT(cmd,UNIQUENAME)

#define MYFUNCTION(nr,nazwa) void nazwa(); CALLOUTSIDE(callbacks[nr]=&nazwa;) void nazwa()

map<int,void(*)()> callbacks;


MYFUNCTION(1,krzysiu)
{
  cout << "krzysiu" << endl;
}

MYFUNCTION(2,krwq)
{
  cout << "krwq" << endl;
}

MYFUNCTION(0,_4programmers)
{
  cout << "4programmers" << endl;
}

int main()
{
  for (int i=0; i<3; i++)
    callbacks[i]();
  return 0;
}

Output:

4programmers
krzysiu
krwq
0

Albo tak na szybko:

// singleton 
class RejestratorFunkcji {
public:
  // sprawdź czy obiekt rejestrator istnieje, jeśli nie - stwórz go
  // i zarejestruj funkcję w nim
  static void registerFunc(FunkcjaRejestrowana *func);
  // wywołaj wszystkie zarejestrowane funkcje - wywołując call()
  static void execute();
};

struct FunkcjaRejestrowana {
  FunkcjaRejestrowana() {
    RejestratorFunkcji::registerFunc(this);
  }
};

struct MojaFunkcja1: public FunkcjaRejestrowana {
  virtual void call() {
   // wykonanie funkcji
  }
} Funkcja1;

struct MojaFunkcja2: public FunkcjaRejestrowana {
  virtual void call() {
   // wykonanie funkcji
  }
} Funkcja2;

// 
void main() {
  RejestratorFunkcji::execute();
  RejestratorFunkcji::dispose(); // zwolnij rejestrator
}
0

co to robi?

#define CONCAT_DETAIL(a, b) a##b 

1 użytkowników online, w tym zalogowanych: 0, gości: 1