AA specialization not works
JdavidLS
jdavidls at gmail.com
Mon Sep 24 16:05:30 PDT 2007
// an example for template context code:
/*
_ArraySpec template generates const info using specialization of undetermined type of Array. Excuse my poor english.
*/
// Specialization for static array:
/*
template _ArraySpec(A: A[C], const uint C) // Error: variable C foward referenced
{
const length = C;
alias typeof(A[0]) Type;
alias uint Key;
}*/
// Specialization for dinamic array:
template _ArraySpec(A: A[])
{
alias A.length length;
alias typeof(A[0]) Type;
alias uint Key;
}
// Specialization for AArray:
template _ArraySpec(A: A[C], C)
{
alias A.legth legth;
alias typeof(A[0]) Type;
alias C Key;
}
// Specialization for Non Array:
template _ArraySpec(T)
{
const length = 0;
alias T Type;
alias void Key;
}
typedef uint MyType;
unittest
{
MyType static_array[100];
MyType dinamic_array[] = new MyType[100];
MyType asoc_array[string];
MyType non_array;
// error: does not match any template declaration:
alias _ArraySpec!(static_array) _staticArray;
alias _ArraySpec!(dinamic_array) _dinamicArray;
alias _ArraySpec!(asoc_array) _asocArray;
alias _ArraySpec!(non_array) _nonArray;
writefln( _staticArray.length, typeid(_staticArray.Type), typeid(_staticArray.Type) );
writefln( _dinamicArray.length, typeid(_dinamicArray.Type), typeid(_dinamicArray.Type) );
writefln( _asocArray.length, typeid(_asocArray.Type), typeid(_asocArray.Type) );
writefln( _nonArray.length, typeid(_nonArray.Type), typeid(_nonArray.Type) );
// 100 MyType uint
// 100 MyType uint
// 100 MyType string
// 0 MyType void
// NOT WORKS!!.
// other example for IS context code
void arraySpec(T)(T array)
{
// from: http://www.digitalmars.com/d/expression.html IS documentation.
// for static array:
static if(is(T A: A[K], const uint K)) // Error: found',' when expecting ')'
{
wintwfln(K, typeid(T[0]), typeid(uint)); // length, Type, Key
}
// for asoc array
else static if(is(T A: A[K], K)) // ??? not satisficed for asoc array!!!
{
wintwfln(array.legth, typeid(T[0]), typeid(K)); // length, Type, Key
}
// for dinamic array
else static if(is(T A: A[])) // This satisficed only for dinamic & static array types.
{
wintwfln(array.legth, typeid(T[0]), typeid(uint)); // length, Type, Key
}
else wintwfln(0, typeid(T), typeid(void)); // 0, Type, void
}
arraySpec(static_array);
arraySpec(dinamic_array);
arraySpec(asoc_array);
arraySpec(non_array);
// 100 MyType uint
// 100 MyType uint
// 100 MyType string
// 0 MyType void
// NOT WORKS!!!!! PLEASE HELP ME!!!
}
More information about the Digitalmars-d
mailing list