template instantiation --- having trouble therewith

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


On Thursday, 5 September 2013 at 09:11:06 UTC, John Colvin wrote:
> 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.

I filed a bug report for it
http://d.puremagic.com/issues/show_bug.cgi?id=10969


More information about the Digitalmars-d-learn mailing list