Policy-based design in D
TheFlyingFiddle via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue Feb 14 02:05:19 PST 2017
On Tuesday, 14 February 2017 at 06:48:33 UTC, TheGag96 wrote:
> Tonight I stumbled upon Andrei's concept of policy-based design
> (https://en.wikipedia.org/wiki/Policy-based_design) and tried
> to implement their example in D with the lack of multiple
> inheritance in mind.
>
> https://dpaste.dzfl.pl/adc05892344f (btw, any reason why
> certificate validation on dpaste fails right now?)
>
> The implementation isn't perfect, as I'm not sure how to check
> members of mixin templates so that you could verify whether
> print() and message() are actually where they should be. How
> would you do that? Is there any use for this kind of thing in
> D, and if so, what would it be? I've hardly dabbled in OOP
> patterns, but the abstraction seems kinda interesting.
Something like this can be used to check if the mixin has a
specific member:
template hasMixinMember(alias mixin_, string member) {
enum hasMixinMember = __traits(compiles, () {
mixin mixin_ mix;
static assert(__traits(hasMember, mix, member));
});
}
struct HelloWorld(alias OutputPolicy, alias LanguagePolicy)
if(hasMixinMember!(OutputPolicy, "print") &&
hasMixinMember!(LanguagePolicy, "message"))
{
mixin OutputPolicy;
mixin LanguagePolicy;
void run() {
print(message());
}
}
Note: This method could fail if you do some compile-time
reflection black magic inside the mixins.
Could also do this:
struct HelloWorld(alias OutputPolicy, alias LanguagePolicy)
{
mixin OutputPolicy output;
mixin LanguagePolicy lang;
void run() {
output.print(lang.message());
}
}
If "output" / "lang" does not contain a particular member you
will get a compile time error at the usage point (although it's
not the best message).
More information about the Digitalmars-d-learn
mailing list