digitalmars.D.learn - Templated functions: explicit and implicit instantiation at the same time?
- Jarrett Billingsley (15/15) Oct 30 2007 This is driving me up the wall. I want to have a function like this:
- Don Clugston (6/29) Nov 01 2007 Do it in two levels.
- Jarrett Billingsley (6/11) Nov 01 2007 First thing I tried. This works for the explicit case, but you can't ca...
- Don Clugston (5/20) Nov 01 2007 Oh, yeah. Now I remember. You still have to put in a !(). Bummer.
This is driving me up the wall. I want to have a function like this: R func(R = int, T)(T t) { } Where R can be specified but defaults to int, and T can be any type inferred from the parameter. Of course this function signature doesn't work, and neither does anything else I've tried. I want to be able to do: func(5); // R is int, T is typeof(5) func!(float)(5); // R is float, T is typeof(5) The problem is that explicit instantiation disables IFTI making it impossible to derive T, and if I have multiple templates named 'func' and some of them are function templates and some aren't, it won't work with IFTI. It seems that I can get one or the other, but not both. Is there a solution?
Oct 30 2007
Jarrett Billingsley wrote:This is driving me up the wall. I want to have a function like this: R func(R = int, T)(T t) { } Where R can be specified but defaults to int, and T can be any type inferred from the parameter. Of course this function signature doesn't work, and neither does anything else I've tried. I want to be able to do: func(5); // R is int, T is typeof(5) func!(float)(5); // R is float, T is typeof(5) The problem is that explicit instantiation disables IFTI making it impossible to derive T, and if I have multiple templates named 'func' and some of them are function templates and some aren't, it won't work with IFTI. It seems that I can get one or the other, but not both. Is there a solution?Do it in two levels. template func(R=int) { R func(T)(T t) {...} }
Nov 01 2007
"Don Clugston" <dac nospam.com.au> wrote in message news:fgc15n$226b$1 digitalmars.com...Do it in two levels. template func(R=int) { R func(T)(T t) {...} }First thing I tried. This works for the explicit case, but you can't call it with IFTI, since func is no longer a function template. I wish the 'is this a function template?' check were a little more lenient/intelligent in some cases.
Nov 01 2007
Jarrett Billingsley wrote:"Don Clugston" <dac nospam.com.au> wrote in message news:fgc15n$226b$1 digitalmars.com...Oh, yeah. Now I remember. You still have to put in a !(). Bummer. func!(long)(3.0i); func!()(4.0); That was the best I could find, around DMD 1.0.Do it in two levels. template func(R=int) { R func(T)(T t) {...} }First thing I tried. This works for the explicit case, but you can't call it with IFTI, since func is no longer a function template. I wish the 'is this a function template?' check were a little more lenient/intelligent in some cases.
Nov 01 2007