More specific instantiations
Marco Leise
Marco.Leise at gmx.de
Tue Feb 14 11:30:18 PST 2012
Am 14.02.2012, 15:46 Uhr, schrieb Timon Gehr <timon.gehr at gmx.ch>:
> It cannot be a compiler optimization because it potentially changes the
> semantics of the code:
>
> template T(U, V, W){
> @templated(W) W idx;
> }
>
> void main(){
> T!(int,double,long).idx = 1;
> assert(T!(double,int,long).idx == 1);
> }
Ah right, I was a bit off-topic then: @templated removes duplicate static
data (if desired) whereas the code gen optimization removes duplicate code
(automatically). Can we make this distinction at least, or did I miss
something else? The initial post by bearophile was about both - code and
data, and I argue that the compiler can figure out which code/methods are
duplicates, which would be preferred over doing it manually.
These uses would remain:
template T(U, V, W) {
@templated(W) W idx;
}
struct Foo(U, V, W) {
void bar() { // one method per W
@templated(W) static W value;
}
void foobar() { // one method per U, V, W
static W value;
}
}
while this would be invalid:
struct Foo(U, V, W) {
@templated(W) void bar() {
static W value;
}
}
The reasons are that it could duplicate a safe compiler optimization if
used on methods and I think @templated is easier to understand if it only
applies to static data.
-- Marco
More information about the Digitalmars-d
mailing list