Templates and Associative Arrays

downs default_357-line at yahoo.de
Mon Jan 21 09:42:57 PST 2008


dsimcha wrote:
> Is it possible to create a template function that treats regular dynamic
> arrays the same as associative arrays?  For example, I want to create a very
> simple template function to extract a column from a 2-d array of T's.  If the
> array is non-associative in both dimensions, the function could be trivially
> implemented as:
> 
> T[] extract_column(T)(T[][] data, size_t column_to_extract)
> {
>     T[] extracted_column;
>     foreach(row; data)
>     {
>         extracted_column~=row[column_to_extract];
>     }
>     return extracted_column;
> }
> 
> However, in the case of an associatve array, I cannot think of any obvious way
> to make this work without essentially implementing it four different times,
> once each for an associative and non-associative row dimension and likewise
> for the column dimension.

Sure :)

Keep in mind, this code isn't tested .. but it should work in theory.

template Init(T) { T Init; }

import std.traits;
template NestedArrayElemType(T) {
  // this uses return-type autodeduction to basically say "if we iterated over the elements of T, and returned elem2; what would its type be?"
  alias ReturnType({ foreach (elem; Init!(T)) foreach (elem2; elem) return elem2; }) NestedArrayElemType;
}

alias NestedArrayElemType naet;

naet!(T) extract_column(T)(T data, size_t which) {
  naet!(T) res;
  foreach (row; data) res ~= row[which];
  return res;
}

 --downs



More information about the Digitalmars-d mailing list