digitalmars.D - template tempalte arguments
- Ivan Senji (45/45) Oct 15 2004 At first i missed tempalte template arguments but then alias
- Sean Kelly (5/8) Oct 15 2004 It's because you're using "alias." Change Length(alias TypeList) to
- Ivan Senji (3/11) Oct 16 2004 Thanks a lot! I was sure i tried that but i didn't. Thanks :)
- Ivan Senji (29/29) Oct 16 2004 Another question(hope this one is as easy to answer as the previous
At first i missed tempalte template arguments but then alias
tempalte arguments should be their superset. But what am i
doing wrong here:
import std.stdio;
template TypeList(T,U)
{
struct TypeList
{
alias T Head;
alias U Tail;
}
}
class NullType{}
alias TypeList!(byte , TypeList!(short, NullType)) IntegerTypes;
template Length(T : NullType)
{
//enum {value = 0 };
const int value = 0;
}
template Length(alias TypeList)
{
//enum {value = 1+Length!(TypeList.Tail).value };
const int value = 1 + Length!(TypeList.Tail).value;
}
int main ( char [] [] args )
{
writefln("Typelist length is %d",Length!(IntegerTypes).value);
//writefln,getch;
return 1;
}
The problem is in the Length template, if i use enums i get:
E:\D language\testtemplates\templates1\templates1.d(22): undefined
identifier template instance Length!(TypeList ).value
E:\D language\testtemplates\templates1\templates1.d(22): void has no value
E:\D language\testtemplates\templates1\templates1.d(22): incompatible types
for ((1) + (template instance Length!(TypeList ).value)): 'int' and 'void'
E:\D language\testtemplates\templates1\templates1.d(22): Integer constant
expression expected instead of 1 + template instance
Length!(TypeList ).value
E:\D language\testtemplates\templates1\templates1.d(28): template instance
Length!(TypeList ) error instantiating
and if i use const int i get:
E:\D language\testtemplates\templates1\templates1.d(23): non-constant
expression 1 + value
Can this be done in D?
Oct 15 2004
Ivan Senji wrote:At first i missed tempalte template arguments but then alias tempalte arguments should be their superset. But what am i doing wrong hereIt's because you're using "alias." Change Length(alias TypeList) to Length(TypeList), though it would probably be less confusing to make it Length(T). Sean
Oct 15 2004
"Sean Kelly" <sean f4.ca> wrote in message news:ckpqbl$2vkr$1 digitaldaemon.com...Ivan Senji wrote:Thanks a lot! I was sure i tried that but i didn't. Thanks :)At first i missed tempalte template arguments but then alias tempalte arguments should be their superset. But what am i doing wrong hereIt's because you're using "alias." Change Length(alias TypeList) to Length(TypeList), though it would probably be less confusing to make it Length(T).Sean
Oct 16 2004
Another question(hope this one is as easy to answer as the previous
one)
TypeList template is the same as in my firrst post:
//i think i got this one right
template IndexOf(X: NullType,T)
{
enum{IndexOf=-1};
}
//but this specialization i don't know how to convert from C++:
template IndexOf(TypeList, T : TypeList.Head ) //templates1.d(41): no
property 'Head' for type 'TypeList'
{
enum{IndexOf=0};
}
/*
in C++
template<class T, class Tail>
struct IndexOf<TypeList<T,Tail>,T>
{
enum{value = 0};
};
*/
//this one is ok i think:
template IndexOf(TypeList,T)
{
enum{temp = .IndexOf!(TypeList.Tail,T)};
enum{IndexOf = temp ==-1?-1:1+temp};
}
Hope someone can answer :)
Oct 16 2004









"Ivan Senji" <ivan.senji public.srce.hr> 