Mixin templates as virtual function add tool
ag0aep6g via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri Apr 8 06:11:45 PDT 2016
On 08.04.2016 14:04, Voitech wrote:
> template MixinTypeIterate(alias mixinTemplate,TList...){
[...]
> }
> how to alias mixin template to be able to pass it to this one ?
>
> class BaseClass(T){
> protected alias Types=AliasSeq!(int,string,ubyte);
> private alias WrappedMix(S)=mixin Mix!(T,S); //not compiles - mixins
> are no t regular templates
private mixin template WrappedMix(S) {mixin BaseMix!(T, S);}
Fixed a typo here: Mix -> BaseMix.
> mixin MixinTypeIterate!(WrappedImplMix,Types);
> }
> class ImplClass(T){
> private alias WrappedMix(T)=mixin ImplMix!(T,S); //not compiles -
> mixins are no t regular templates
Ditto:
private mixin template WrappedMix(S) {mixin ImplMix!(T, S);}
Fixed another typo here: parameter T -> parameter S.
By the way, I find this very condensed style with no spaces around
equals signs, after commas, or before braces quite hard to read.
> mixin MixinTypeIterate!(WrappedImplMix,Types);
> }
Here's another thing that may be interesting to you. You can a have
sequence of sequences by wrapping them in a non-eponymous template:
----
template Box(stuff ...) {alias contents = stuff;}
mixin template MixinTypeIterate(alias mixinTemplate, boxes ...)
{
static if (boxes.length > 0)
{
mixin mixinTemplate!(boxes[0].contents);
mixin MixinTypeIterate!(mixinTemplate, boxes[1..$]);
}
}
mixin template simpleExample(T ...)
{
void f(T args) {import std.stdio; writeln(args);}
}
mixin MixinTypeIterate!(simpleExample, Box!int, Box!(float, string));
void main()
{
f(42);
f(42.2, "foo");
}
----
More information about the Digitalmars-d-learn
mailing list