implicitly convert function pointers to delegates

KennyTM~ kennytm at gmail.com
Sun Oct 26 11:49:08 PDT 2008


Jarrett Billingsley wrote:
> On Sun, Oct 26, 2008 at 2:11 PM, KennyTM~ <kennytm at gmail.com> wrote:
>> Moritz Warning wrote:
>>> Hi,
>>>
>>> some people discovered that functions can be wrapped into delegates
>>> without allocation.
>>>
>>> Here is one out of several similar solutions:
>>>
>>> R delegate(T) toDg(R, T...)(R function(T) fp) {
>>>    struct dg {
>>>        R opCall(T t) {
>>>            return (cast(R function(T)) this) (t);
>>>        }
>>>    }
>>>    R delegate(T) t;
>>>    t.ptr = fp;
>>>    t.funcptr = &dg.opCall;
>>>    return t;
>>> }
>>>
>>> I would like to ask if we can get this into the language?
>>> It would make working with delegates and function pointers much more
>>> easier when function pointers implicitly convert to delegates when they
>>> "have to".
>> vote++ for implicit conversion. An FP can be *safely* converted to any DGs.
>>
>> BTW,
>>
>>  alias float delegate (in float) DG;
>>
>>  float area (in float radius) {
>>        float r2 = radius * radius;
>>        return 3.1415926535 * radius;
>>  }
>>
>>  DG x;
>>  x.ptr = null;
>>  x.funcptr = &area;
>>  // writefln(typeof(x.funcptr).stringof); // ensure it's an FP not DG.
>>  writefln(x(10)); // writes 314.159 without any error.
>>
>>
>> Why this simpler solution is not used? The function pointer can't touch the
>> frame pointer anyway (an FP cannot access stuff outside its scope).
>>
> 
> The calling conventions for functions and delegates is different.
> This method does not work in the general case.

I see. And indeed it does not work if I change float to int -- the 
arguments are shifted by 4 bytes to the left. (How come float works??)



More information about the Digitalmars-d mailing list