digitalmars.D - Suggestion : improve compile-time type manipulation facilities
- Alex B. (45/45) Jun 29 2004 It seems pattern matching in specialization facilities of D aren't power...
- Andy Friesen (19/74) Jun 29 2004 I believe this is a bug. One workaround is to do:
- Alex B. (3/4) Jun 29 2004 Thanks! Excellent code.
- Andy Friesen (10/17) Jun 29 2004 The problem is that, somehow, aliases aren't quite first class citizens
- Sean Kelly (4/4) Jun 29 2004 Attempting to compile this example in version 0.93 actually crashes the
It seems pattern matching in specialization facilities of D aren't powerful
enough to implement concept of type-lists. Well it simply can't match smthing
like 'template <class T, class U> struct Length< Typelist<T, U> >' and it is
essential feature of C++ template engine.
I tried a simpler way to implement them and discovered a serious clash between
'properties' concept and type aliasing.
Here is the code:
class NullType
{
}
template TypeList(U,V)
{
class TypeList
{
alias U Head;
alias V Tail;
}
}
template TL_Length(Arg : NullType)
{
enum
{
Result = 0
}
}
template TL_Length(Arg)
{
enum
{
Result = 1 + TL_Length!(Arg.Tail).Result
}
}
void main()
{
// no property 'Tail' for type 'TypeList'
printf("%d\n",TL_Length!(TypeList!(int,TypeList!(float,NullType))).Result);
// ok
typeid(TypeList!(int,TypeList!(float,NullType)).Tail).print();
// no property 'Tail' for type 'TypeList'
typeid(TypeList!(int,TypeList!(float,NullType)).Tail.Tail).print();
// .property not implemented for typeof
typeid(typeof(TypeList!(int,TypeList!(float,NullType)).Tail).Tail).print();
}
Are there any work-arounds? Is it possible to make a proper implementation of
specialization?
Jun 29 2004
Alex B. wrote:
It seems pattern matching in specialization facilities of D aren't powerful
enough to implement concept of type-lists. Well it simply can't match smthing
like 'template <class T, class U> struct Length< Typelist<T, U> >' and it is
essential feature of C++ template engine.
I tried a simpler way to implement them and discovered a serious clash between
'properties' concept and type aliasing.
Here is the code:
class NullType
{
}
template TypeList(U,V)
{
class TypeList
{
alias U Head;
alias V Tail;
}
}
template TL_Length(Arg : NullType)
{
enum
{
Result = 0
}
}
template TL_Length(Arg)
{
enum
{
Result = 1 + TL_Length!(Arg.Tail).Result
}
}
void main()
{
// no property 'Tail' for type 'TypeList'
printf("%d\n",TL_Length!(TypeList!(int,TypeList!(float,NullType))).Result);
// ok
typeid(TypeList!(int,TypeList!(float,NullType)).Tail).print();
// no property 'Tail' for type 'TypeList'
typeid(TypeList!(int,TypeList!(float,NullType)).Tail.Tail).print();
// .property not implemented for typeof
typeid(typeof(TypeList!(int,TypeList!(float,NullType)).Tail).Tail).print();
}
Are there any work-arounds? Is it possible to make a proper implementation of
specialization?
I believe this is a bug. One workaround is to do:
struct Empty{}
template TypeList(_Head, _Tail) {
struct TypeList {
alias _Head HeadType;
alias _Tail TailType;
HeadType head;
TailType tail;
}
}
template Length(_TL) {
// _Tl.HeadType or TailType won't work. But this will:
const int Length = 1 + .Length!(typeof(_TL.tail));
}
template Length(_TL : Empty) {
const int Length = 0;
}
-- andy
Jun 29 2004
I believe this is a bug. One workaround is to do:Thanks! Excellent code. D's ability to directly return value of template instaniation is totally cool. Too bad it doesn't support specialization well enough. :(
Jun 29 2004
Alex B. wrote:The problem is that, somehow, aliases aren't quite first class citizens of the namespace. Like I said, I believe this to be a bug, not a deficiency. :) I really would like to see some more clever deduction, though, a la: template LastTwo(_Head, _Dummy : TypeList!(_TailHead, _TailTail : Empty)) { alias _TailHead Last; alias _Head SecondLast; } -- andyI believe this is a bug. One workaround is to do:Thanks! Excellent code. D's ability to directly return value of template instaniation is totally cool. Too bad it doesn't support specialization well enough. :(
Jun 29 2004
Attempting to compile this example in version 0.93 actually crashes the compiler. And it produces different errors as well. So I would report this as a bug in 0.93 and see how things work once it's been fixed. Sean
Jun 29 2004









Andy Friesen <andy ikagames.com> 