On Friday, 14 April 2017 at 08:24:00 UTC, Johannes Pfau wrote:
I've got this code duplicated in quite some functions:

---------------------
[...]1

            foreach (MethodType; overloads)
            {
                // function dependent code here
            }
[...]2
--------------------

What's the idiomatic way to refactor / reuse this code fragment?

-- Johannes

Your options are at least the following two (both untested, but should work):

Option 1: Template Mixins

---
mixin template Foo(alias API, Dg)
{
    void foo()
    {
       [...]1
             foreach (MethodType; overloads)
             {
                Dg(MethodType);
             }
       [...]2
    }
}

mixin Foo!(API, (MethodType) {
// function dependent code here
});
foo();
---

Option 2: Code generation using CTFE

---
string genFoo(alias API, string justDoIt)
{
    import std.array : appender;
    auto code = appender!string;
    code.put(`[...]1`);
    code.put(`foreach (MethodType; overloads) {`);
    code.put(justDoIt);
    code put(`}`);
    code.put(`[...]2`);
}

mixin(genFoo!(API, q{
    // function dependent code here
})());
---

Personally, I'd consider the second approach to be idiomatic, but YMMW.

Reply via email to