template instantiation --- having trouble therewith

John Colvin john.loughran.colvin at gmail.com
Thu Sep 5 02:11:05 PDT 2013


On Thursday, 5 September 2013 at 09:00:27 UTC, John Colvin wrote:
> On Tuesday, 3 September 2013 at 11:51:37 UTC, Carl Sturtivant 
> wrote:
>>>
>>> I'm confused as to what you're trying to do... your example 
>>> code is equivalent to
>>>
>>> import std.stdio;
>>> int x = 3;
>>> int scale( int s) { return x * s; }
>>> auto f = &scale;
>>> writeln( f(7) );
>>
>> No it isn't according to dmd.
>>
>> My code is a minimal piece that produces the same error as 
>> some real code. The higher order generic function muddle in 
>> the real code is supposed to transform one delegate into 
>> another, but I still get the template problem if muddle is the 
>> identity function (given here).
>>
>> My example code isn't equivalent to the above according to the 
>> compiler. Why is that? And how can I make it work?
>
> Ok, that makes more sense.
>
> The reason why it doesn't work is that you're effectively 
> asking the compiler to work backwards from {the type of the 
> delegate passed to muddle} to {the type parameters that would 
> have to be used in Dptr to generate that delegate type}.
> I'm no expert on type-deduction algorithms, but I seriously 
> doubt that's a solvable problem in the general case, especially 
> considering that the definition of Dptr could contain string 
> mixins etc.   In the general case, all code is forwards-only.
>
> Anyhow, it's easy to work around:
>
> import std.traits : ReturnType, ParameterTypeTuple;
>
> template Dptr( T, U...) {
> 	alias T delegate( U args) Dptr;
> }
>
> auto muddle( DT)( DT f) {
> 	alias T = ReturnType!f;
> 	alias U = ParameterTypeTuple!f;
> 	//use T and U
> 	return f; //or make another delegate in real code
> }
>
>
> unittest {
> 	import std.stdio;
> 	int x = 3;
> 	int scale( int s) { return x * s; }
> 	Dptr!(int,int) f = muddle( &scale);
> 	writeln( f(7));
> }

Having said that, in the case where you explicitly set the 
template parameters to muddle I think it *should* work and is 
probably a bug (or at least a simple enhancement) that it doesn't.


More information about the Digitalmars-d-learn mailing list