Thread overview
template mixin in class is virtual function?
May 19, 2010
strtr
May 21, 2010
strtr
May 21, 2010
div0
May 21, 2010
strtr
May 21, 2010
div0
May 21, 2010
strtr
May 19, 2010
Will template-mixin-functions always be virtual in classes?

"Mixins can add virtual functions to a class" http://www.digitalmars.com/d/1.0/template-mixin.html

related: http://odefu.blogspot.com/2008/12/composite-oriented-programming.html
May 21, 2010
Or more to the point:

Can (Class) template mixin functions be devirtualized by the compiler or do I (as
optimization) need to manually copy paste the boiler plate code?
May 21, 2010
strtr wrote:
> Or more to the point:
> 
> Can (Class) template mixin functions be devirtualized by the compiler or do I (as
> optimization) need to manually copy paste the boiler plate code?

You can just wrap the mixin in a final block:

import std.stdio;

template bar(T) {
	void test(T t) {
		writefln("t: %s", t);
	}
}

class foo {
	final {
		mixin bar!(int);
	}
}

int main(){
	scope f = new foo;
	f.test(3);
	return 0;
}

- --
My enormous talent is exceeded only by my outrageous laziness.
http://www.ssTk.co.uk
May 21, 2010
== Quote from div0 (div0@users.sourceforge.net)'s article
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> strtr wrote:
> > Or more to the point:
> >
> > Can (Class) template mixin functions be devirtualized by the compiler or do I (as
> > optimization) need to manually copy paste the boiler plate code?
> You can just wrap the mixin in a final block:
> import std.stdio;
> template bar(T) {
> 	void test(T t) {
> 		writefln("t: %s", t);
> 	}
> }
> class foo {
> 	final {
> 		mixin bar!(int);
> 	}
> }
> int main(){
> 	scope f = new foo;
> 	f.test(3);
> 	return 0;
> }

Is that different from making all functions within the template final?

May 21, 2010
strtr wrote:
> == Quote from div0 (div0@users.sourceforge.net)'s article
>> -----BEGIN PGP SIGNED MESSAGE-----
>> Hash: SHA1
>> strtr wrote:
>>> Or more to the point:
>>>
>>> Can (Class) template mixin functions be devirtualized by the compiler or do I (as
>>> optimization) need to manually copy paste the boiler plate code?
>> You can just wrap the mixin in a final block:
>> import std.stdio;
>> template bar(T) {
>> 	void test(T t) {
>> 		writefln("t: %s", t);
>> 	}
>> }
>> class foo {
>> 	final {
>> 		mixin bar!(int);
>> 	}
>> }
>> int main(){
>> 	scope f = new foo;
>> 	f.test(3);
>> 	return 0;
>> }
> 
> Is that different from making all functions within the template final?
> 

Well it delegates the choice of virtual versus non virtual to the class using the mixin. No idea if that's a good idea or a bad one; I guess you'd have to think very carefully about what your mixin is trying to achieve.

I just tried marking a function in the template final
and that seems to work as well, so you could have a mix of virtual and
non virtual in a template, but that feels like a hackish design.

So you can it appears do this: (though that's dmd 2.028)

template bar(T) {
   final:
	void test(T t) {
		writefln("t: %s", t);
	}
	void test2() {
	}
}

class foo {
	mixin bar!(int);
}

int main(){
	foo f = new foo;
	f.test(3);
	f.test2();
	return 0;
}

- --
My enormous talent is exceeded only by my outrageous laziness.
http://www.ssTk.co.uk
May 21, 2010
== Quote from div0 (div0@users.sourceforge.net)'s article
> strtr wrote:
> > Is that different from making all functions within the template final?
>
> Well it delegates the choice of virtual versus non virtual to the class
> using the mixin. No idea if that's a good idea or a bad one; I guess
> you'd have to think very carefully about what your mixin is trying to
> achieve.
> I just tried marking a function in the template final
> and that seems to work as well, so you could have a mix of virtual and
> non virtual in a template, but that feels like a hackish design.
> So you can it appears do this: (though that's dmd 2.028)
> template bar(T) {
>    final:
> 	void test(T t) {
> 		writefln("t: %s", t);
> 	}
> 	void test2() {
> 	}
> }
> class foo {
> 	mixin bar!(int);
> }
> int main(){
> 	foo f = new foo;
> 	f.test(3);
> 	f.test2();
> 	return 0;
> }

I've been marking functions final on a per function basis within the templates but after reading the docs I was afraid the compiler might just ignore the attribute and make all mixin-template-functions virtual.

"Mixins can add virtual functions to a class" http://www.digitalmars.com/d/1.0/template-mixin.html

But that sentence was probably meant as an example not the exclusive description :)

Anyway, Thanks!!
Shouldn't be thinking about optimization anyways ;)