Некоторое время назад 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;
}
станд :: функция это именно то, что вы ищете. Если вы хотите учиться как такой механизм фактически реализован в библиотеке, вот Хорошая серия постов в блоге. Объедините это с лямбда-функции для захвата локальных переменных.