Template delegate/function ptr struct member

uri via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue May 13 03:49:14 PDT 2014


On Tuesday, 13 May 2014 at 07:50:09 UTC, Rikki Cattermole wrote:
> On 13/05/2014 7:28 p.m., ed wrote:
>> I'm porting some C++ code to D and a struct has the following 
>> member:
>>
>> struct S
>> {
>> // ...
>>  //void* (*createMethod)();
>>
>> void* function() createMethod;
>>
>> }
>>
>> I'd like to extend this as little to accept delegates for 
>> future use
>> without breakage to existing code...
>>
>> Is it possible to template this so "createMethod" can be a 
>> delegate() or
>> function() of any type *and* have the compiler infer the type 
>> from ctor
>> parameters?
>>
>> For example:
>> ---
>> struct S(F)
>> {
>>     // ...
>>     F createMethod;
>>     this(alias F)() {createMethod = &F;}
>> }
>> static void* func() {return null;}
>>
>> void main() {
>>     auto s1 = S(&func);
>>     auto s2 = S(&Object.classinfo.create);
>>
>>     // s1 is S!(void* function())
>>     // s2 is S!(Object delegate() const);
>> }
>> ---
>>
>> Is this a good idea or am I way off?
>>
>> Thanks,
>> ed
>
> I would recommend going the route of property functions and 
> using delegates as the default.
>
> alias createMethodDel = void* delegate();
> alias createMethodFunc = void* function();
>
> struct S {
>     private createMethodDel createMethod_;
>
>     @property {
>         createMethodDel createMethod() {
>             return createMethod_;
>         }
>
>         void createMethod(createMethodDel func) {
>             createMethod_ = func;
>         }
>
>         void createMethod(createMethodFunc func) {
>             import std.functional : toDelegate;
>             createMethod_ = toDelegate(func);
>         }
>     }
> }
>
> That way you know what you have access to is always callable 
> and won't break any code.

I was so focused on a template solution that I never even thought 
of doing it that way, nice one :)


Thanks,
ed


More information about the Digitalmars-d-learn mailing list