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

Reply via email to