# Q about template for matching arrays

Bill Baxter dnewsgroup at billbaxter.com
Thu Feb 1 06:25:56 PST 2007

```Kirk McDonald wrote:
> Bill Baxter wrote:
>> I'd like to write a template function something like:
>>
>>    T foo(T,S)(S x)
>>
>> that takes arrays of various kinds and returns an element of the base
>> type (well really something derived from the base type, but that
>> part's easy).
>>
>> The trick is that what I'd really like is for it be able to be used in
>> all of the following ways:
>>
>>   // IFTI
>>   foo(3)    // T=int S=int
>>   foo([3])  // T=int S=int[]
>>   foo([[3]])  // T=int S=int[][]
>>   foo([[[3]]])  // T=int S=int[][][]
>>   ... etc
>>
>>   // Base type explicit
>>   foo!(float)(3)  // T=float S=float
>>   foo!(float)([3])  // T=float S=float[]
>>   foo!(float)([[3]])  // T=float S=float[][]
>>   ... etc
>>
>> It's easy if you say you have to call it like foo!(float[][])([[3]]),
>> but that's annoying.
>>
>> Any bright ideas?
>>
>> --bb
>
> This only works for dynamic arrays, but:
>
> typeof(T.init[0]) foo(T)(T x) {}
>

Just getting the base type of the array is not what I'm after.

The ultimate goal is to write something that's as close as possible to
NumPy's 'asarray' function, a function which takes a wide range of input
types and returns an n-dimensional "Array!(Type)" object built from that
data.

The trick is that in some cases I might like to coerce the data type.  Like
asarray!(cfloat)([[1,2],[3,4]])

but with the above asarray(T)(T x) declaration that gives an error like
"int[][] is not a cfloat".

I suspect I may just have to settle for two versions like asarray(T)(T
x) and
template asarray_of_type(AT) { asarray_of_type(T)(T x) {} }

Yeh, that doesn't seem so bad actually.

--bb
```

More information about the Digitalmars-d-learn mailing list