|
我们都知道不可以将一个函数指针指向一个未知类中的非静态成员函数。
虽然一些stl中提供了memfun,以及一些slot都提供了解决主案,但都不是很完美。有一些需要将函数类型在基类中全部定义出来,有一些需要在每个函数指针赋值时自行写上强制转换,十分麻烦。
而在《古月》的GUI中,大量使用了Borland所特有的__closure关键字。而这个关键字的用处便是可以定义一个指向任意类成员函数的函数指针。
由于在标准C/C++并无这一定义,而Visual C/C++所定义的特别关键字又不对一般程序开放(如使用会被告之是内部关键字,不可用)。
《古月》v18.LR-25/26将提供一种通过汇编与模板组合的实现方式,来支持这种设计。由于这些代码是模板形式存在的,所以在等新版《古月》发布后,大家可以轻易的拆出使用在自己的程序上。
这里提供一段示例:
class _Object{}; //真的就是这样空的,不需要任意内容
#ifdef __BORLANDC__
#define SetEventCall(event_obj,event_func) event_obj=event_func
#define CallEvent(event_obj) event_obj
#define DefineEvent(name,result,intro) result (__closure *name)intro
#else
............//Visual C/C++代码暂时不公布
#endif//__BORLANDC__
class Button
{
public:
DefineEvent(OnButtonClick,void,(Button *,int));
//void (__closure *OnButtonClick)(Button *,int); //Borland C/C++版实质代码
void TestButtonClick()
{
CallEvent(OnButtonClick)(this,0);
//OnButtonClick(this,0); //Borland C/C++版实质代码
}
Button()
{
printf("Button this=%p\n",this);
}
}
class Test:public _Object
{
Button *button;
void OnClick(Button *but)
{
printf("Test::OnClick,this=%p,but=%p\n",this,but);
};
Test()
{
printf("Test this=%p\n",this);
button=new Button;
SetEventCall(button->OnButtonClick,OnButtonClick);
//button->OnButtonClick=OnButtonClick; //Borland C/C++版实质代码
button->TestButtonClick();
}
};
为了保持BC/VC都可以编译,所以未来将会以这种方式出现原本__closure关键字的使用方式。 |
|