shawind 发表于 2007-11-13 21:56:35

看来是我误解d手册里的那句话了。
“委托是两块数据的聚集:一个对象引用和一个函数指针。”
它这里说的对像引用,和我想的完全不是那么一回事。如果不是rednaxela花时间做这实验,我还不知道要浪费多少时间

rednaxela 发表于 2007-11-13 21:59:51

倒没花什么时间,因为代码和出来的结果都是预先知道的。
C#里的delegate就有趣些(同时也臃肿些)……不过基本概念一样,它只关心参数个数和类型,以及返回类型

shawind 发表于 2007-11-14 14:42:56

我是直接从c过来,在D中第一次接触委托这个概念,还想当然的自以为事,连个基本的实验也不作,实在是太不认真了。(当然,就算是认真起来,好像也没多大作用-_-!)

lw 发表于 2007-11-16 20:57:19

关于那个函数指针的用法例子,TO FX:

但是如果拥有成员的参数怎么办,估计在传递的时候 & 符号被再分析为先存储对象的引用(地址),这样一个dg差不多就保存了一对信息,这个就和以前啥啥对象指针这样了

没看过D的规范,乱猜……

lw 发表于 2007-11-16 20:59:20

TO Shawind大,有BLOG也給个罢……XD
最近觉得还是看BLOG看的东西多点XD,不过目前只有FX大的……

rednaxela 发表于 2007-11-16 22:24:08

引用第13楼lw于2007-11-16 20:57发表的:
关于那个函数指针的用法例子,TO FX:

但是如果拥有成员的参数怎么办,估计在传递的时候 & 符号被再分析为先存储对象的引用(地址),这样一个dg差不多就保存了一对信息,这个就和以前啥啥对象指针这样了

没看过D的规范,乱猜……
在D里,delegate与普通function pointer(注意D里这两者都有)的区别就是在于会保存一个环境指针。不过它的类型是void*的,所以并不在乎成员方法是属于什么类型的。
引用第14楼lw于2007-11-16 20:59发表的:
TO Shawind大,有BLOG也給个罢……XD
最近觉得还是看BLOG看的东西多点XD,不过目前只有FX大的……
shawind大的JavaEye的blog是空的 T T

shawind 发表于 2007-11-16 22:55:41

我的程序水平在javaeye里是绝对的不入流,没脸在那里记blog。

以前学委托和函数指针的时候写了玩的,D中委托和函数指针的区别。

import std.stdio:writefln;

int function(int, int) padd; //函数指针
int delegate(int, int) dadd; //委托
int (*cpadd)(int, int);//和padd等价

//int function(int, int) pfunc;
//int delegate(int, int) dgfunc;
   
int myadd(int a, int b) {return a+b;} //在外面的函数,没有环境信息,&后为函数指针

class Cmyadd
{
    int add(int a, int b) {return a+b;}
}

void main()
{
    static int myadd2(int a, int b) {return a+b;}//嵌套的静态函数,没有环境信息,&后为函数
    int myadd3(int a, int b) {return a+b;}//嵌套的动态函数,带有环境信息,&后为委托
    Cmyadd myadd4 = new Cmyadd;//类,结构中,带有环境信息,&后为委托

    padd = &myadd;
    writefln(padd(1,0));
    padd = &myadd2;
    writefln(padd(2,0));
//    padd = &myadd3;//cannot implicitly convert expression (&myadd2) of type int delegate(int, int) to int(*)(int, int)
//    padd = &myadd4.add;// cannot implicitly convert expression (&myadd3.add) of type int delegate(int, int) to int(*)(int, int)

   
//    dadd = &myadd; //cannot implicitly convert expression (& myadd) of type int(*)(int, int) to int delegate(int, int)
//    dadd = &myadd2;//func.d(29): Error: cannot implicitly convert expression (& myadd2) of type int(*)(int, int) to int delegate(int, int)
    dadd = &myadd3;
    writefln(dadd(3,0));
    dadd = &myadd4.add;
    writefln(dadd(4,0));
   
    cpadd = &myadd;
    writefln(cpadd(1,0));
    cpadd = &myadd2;
    writefln(cpadd(2,0));
//    cpadd = &myadd3;//cannot implicitly convert expression (&myadd2) of type int delegate(int, int) to int(*)(int, int)
//    cpadd = &myadd4.add;//cannot implicitly convert expression (&myadd3.add) of type int delegate(int, int) to int(*)(int, int)

    int a(int delegate(int, int) fdg, int a, int b) {return (fdg(a,b));}
    writefln(a(&myadd3, 5,5));
   
   int b(int function(int, int) fp, int a, int b) {return (fp(a,b));}
    writefln(b(&myadd, 10,10));
}

lw 发表于 2007-11-17 10:47:36

void* 那具体是什么类型又怎么知道呢?
恐怕每个void*先只向对象的地址,从地址中先找到具体的类型,转型了之后
才根据类型来获得对应的成员?
delegate function 非要用这两个KEYWORD来显示区分??

shawind 发表于 2007-11-17 12:03:52

好像D中void*类型在实际使用时,可以把任何类型的指针放到这里。
但如何去判断具体类型,好像D1.0还做不到,D2.0可以方便的完成这个任务。

委托和函数指针用了两个关键字。
委托必须用加关键字的写法,函数指针也可以和C一样写法。C的大部分习惯性在D中都有保留。

lw 发表于 2007-11-17 16:52:08

怎么个方便呢……

不知道委托怎么实现的……C++的话通常会用一堆枚举类似的东西支持各类函数参数……总觉得好多啊(但是之后就很少了……不明白就无视掉罢……),很神奇0-0
页: 1 [2] 3
查看完整版本: [很麻烦]opengl,step 0