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