c ++ указатель на функцию-член, замена для __closure

Некоторое время назад Borland представила в своей среде BCB расширение языка C ++. Это расширение является ключевым словом __closure. Вопрос в том, можно ли реализовать такую ​​функциональность на простом C ++ или C ++ 11? Если вы не знакомы с ключевым словом __closure, приведенный ниже код содержит пояснения в комментариях.

Заранее спасибо!
Toreno

#include <stdio.h>

// __closure keyword is used here !
typedef void (__closure * MemberCallback)(int x, int y, int z);

class A
{
private:

MemberCallback callback;public:

A() : callback(NULL)
{
}

void setCallback(MemberCallback newCallback)
{
callback = newCallback;
}

void call(int x, int y, int z)
{
if(callback)
callback(x, y, z);
else
printf("NOT SET(%i, %i, %i)\n", x, y, z);
}
};

class B
{
public:

void func1(int x, int y, int z)
{
printf("FUNC 1(%i, %i, %i)\n", x, y, z);
}

void func2(int x, int y, int z)
{
printf("FUNC 2(%i, %i, %i)\n", x, y, z);
}

};

int main()
{
// A and B classes do not know about each other. There is no possibility
// to for inheritance because B class can implement multiple instances
// of callback function
A a;
B b;

a.call(1, 2, 3);  // Prints: NOT SET(1, 2, 3)

a.setCallback(b.func1);
a.call(4, 5, 6);  // Prints: FUNC 1(4, 5, 6)

a.setCallback(b.func2);
a.call(7, 8, 9);  // Prints: FUNC 2(7, 8, 9)

return 0;
}

1

Решение

станд :: функция это именно то, что вы ищете. Если вы хотите учиться как такой механизм фактически реализован в библиотеке, вот Хорошая серия постов в блоге. Объедините это с лямбда-функции для захвата локальных переменных.

3

Другие решения


По вопросам рекламы [email protected]