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