digitalmars.D.learn - Q about template for matching arrays
- Bill Baxter (22/22) Jan 31 2007 I'd like to write a template function something like:
- Kirk McDonald (7/37) Feb 01 2007 This only works for dynamic arrays, but:
- Bill Baxter (15/51) Feb 01 2007 Just getting the base type of the array is not what I'm after.
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
Jan 31 2007
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? --bbThis only works for dynamic arrays, but: typeof(T.init[0]) foo(T)(T x) {} -- Kirk McDonald Pyd: Wrapping Python with D http://pyd.dsource.org
Feb 01 2007
Kirk McDonald wrote:Bill Baxter wrote: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. --bbI'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? --bbThis only works for dynamic arrays, but: typeof(T.init[0]) foo(T)(T x) {}
Feb 01 2007