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