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