digitalmars.D - Template struct literals should infer template parameters
- Sean Eskapp (12/12) Aug 06 2011 If I have something like
- Philippe Sigaud (9/21) Aug 07 2011 Yeah, function templates have a way to automatically determine their
- Ali =?iso-8859-1?q?=C7ehreli?= (22/40) Aug 07 2011 It has been the same in C++. The reason is that the syntax above would
If I have something like struct S(T) { T data; } I can't make a struct literal with int mystuff; someFunc(S(mystuff)); I have to use int mystuff; someFunc(S!(int)(mystuff)); Why is this?
Aug 06 2011
On Sat, Aug 6, 2011 at 22:19, Sean Eskapp <eatingstaples gmail.com> wrote:If I have something like =C2=A0 =C2=A0struct S(T) =C2=A0 =C2=A0{ =C2=A0 =C2=A0 =C2=A0 =C2=A0T data; =C2=A0 =C2=A0} I can't make a struct literal with =C2=A0 =C2=A0int mystuff; =C2=A0 =C2=A0someFunc(S(mystuff)); I have to use =C2=A0 =C2=A0int mystuff; =C2=A0 =C2=A0someFunc(S!(int)(mystuff)); Why is this?Yeah, function templates have a way to automatically determine their template parameters (IFTI : Implicit Function Template Instantiation?), but that doesn't work with struct and class constructors. Too bad. You can use a factory function to do just that, it's a one-liner: auto s(T)(T t) { return S!(T)(t); } and then: someFunc(s(mystuff));
Aug 07 2011
On Sat, 06 Aug 2011 20:19:06 +0000, Sean Eskapp wrote:If I have something like struct S(T) { T data; } I can't make a struct literal with int mystuff; someFunc(S(mystuff));It has been the same in C++. The reason is that the syntax above would conflict with and is reserved for a templated constructor.I have to use int mystuff; someFunc(S!(int)(mystuff)); Why is this?To allow flexibility by not tieing the struct's template parameters to its constructor's template parameters. Deduction actually works for the constructor: struct S(T) { T data; this(U)(U) {} } void someFunc(T)(T) {} void main() { double d; someFunc(S!int(d)); } The constructor's template parameter is being deduced as 'double' on the last line. Ali
Aug 07 2011