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