Testing for template argument being result of takeExactly

monarch_dodra monarchdodra at gmail.com
Sun Sep 23 23:21:46 PDT 2012


On Sunday, 23 September 2012 at 21:52:23 UTC, Timon Gehr wrote:
> On 09/23/2012 10:57 PM, Ali Çehreli wrote:
>> ...
>>
>> Also, I think your code should have passed a range like R.init 
>> to
>> takeExactly, not R, which is a type:
>>
>>   takeExactly(R.init, 1)
>>
>> I don't know why your code compiles.
>>
>
> See discussion here:
> http://d.puremagic.com/issues/show_bug.cgi?id=8220

Interesting. Thanks.

On Sunday, 23 September 2012 at 21:53:20 UTC, Jonathan M Davis 
wrote:
> On Sunday, September 23, 2012 14:47:27 Timon Gehr wrote:
>> template Hello(R) if(is(typeof(R._input.takeExactly(2)) == R)){
>>      alias R Hello;
>> }
>
> Thanks. That does the trick quite cleanly, though you'd think 
> that it would be
> possible to test whether a template argument is the result of 
> takeExactly
> without caring or knowing about the guts of takeExactly. So, 
> this isn't a
> general purpose solution at all, when I think that there should 
> be one. Still,
> I don't need a general purpose one for what I'm doing, so this 
> should work
> just fine.
>
> - Jonathan M Davis

What is wrong with my proposed solution?

----
import std.range;

template Hello(R)
     if ( is(typeof(takeExactly(R.init, 1))) &&
          is(R == typeof(takeExactly(R.init, 1)))
     )
{
     alias R Hello;
}

struct R
{
     enum empty = false;
     @property int front();
     void popFront();
}

struct S{}

void main( ) {
      Hello!(int[]) a; //OK
      Hello!R b;       //Fails second Check: R == typeof(...)
      Hello!S c;       //Fails first check: 
is(typeof(takeExactly(...)))
}
----

Forgive me again if there is something wrong with it, but this 
time, I think it is correct...?


More information about the Digitalmars-d-learn mailing list