December 25, 2006 Partial Specialization using Static If | ||||
|---|---|---|---|---|
| ||||
Going back to my 'multiple specialization' idea...
Static if can pretty much do the job of multiple specialization, except for one case: partial specialization.
template temp(T : T*)
This doesn't work in a static if:
static if(is(T == T*))
Assuming T = int, the compiler would read this as:
static if(is(int == int*))
I'll forget about the multiple specialization idea for now. We need a simple way to do partial specialization in a static if expression. It is possible to do using a specialized template, but it's a bit of work.
template IsPtr(T){
const bool IsPtr = false;
}
template IsPtr(T : T*){
const bool IsPtr = true;
}
template temp(T1, T2, T3){
static if(IsPtr!(T1) || IsPtr!(T2) || IsPtr(T3)){
}
}
| ||||
December 25, 2006 Re: Partial Specialization using Static If | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Xinok | Xinok wrote: > Going back to my 'multiple specialization' idea... > > Static if can pretty much do the job of multiple specialization, except for > one case: partial specialization. > > template temp(T : T*) > > This doesn't work in a static if: > static if(is(T == T*)) > Assuming T = int, the compiler would read this as: > static if(is(int == int*)) > But you can say this: static if (is(T U == U*)) U is then declared to be an alias of the type T is a pointer to (and it only exists within the static if's scope). Assuming T is int*, you get static if (is(int* U == int*)) static assert(is(U == int)); This works more generally, too: static if (is(T U == U[])) That determines if T is a dynamic array, and U becomes an alias for the type of an element of the array. > > I'll forget about the multiple specialization idea for now. We need a simple > way to do partial specialization in a static if expression. It is possible to > do using a specialized template, but it's a bit of work. > > template IsPtr(T){ > const bool IsPtr = false; > } > template IsPtr(T : T*){ > const bool IsPtr = true; > } > > template temp(T1, T2, T3){ > static if(IsPtr!(T1) || IsPtr!(T2) || IsPtr(T3)){ > } > } -- Kirk McDonald Pyd: Wrapping Python with D http://pyd.dsource.org | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply