April 22, 2014 Named template constraints | ||||
|---|---|---|---|---|
| ||||
Attachments:
| Hi there,
I recently read the 'More Templates' chapter of Ali's book (<-- thanks
for that ;) ).
At the section 'Named constraints', there were a definition like this:
template isUsable(T)
{
enum isUsable = is ( typeof(
{
T obj;
obj.call();
obj.otherCall(1);
obj.ye tAnotherCall();
}() ) );
}
But at Phobos I always see definitions like this (std.range : isInputRange):
template isInputRange(R)
{
enum bool isInputRange = is(typeof(
(inout int = 0)
{
R r = R.init; // can define a range object
if (r.empty) {} // can test for empty
r.popFront(); // can invoke popFront()
auto h = r.front; // can get the front of the range
}));
} What does (inout int = 0) mean/affect here? I created the same
template for myself just without the (inout int = 0) and it worked (at
least with a dummy struct).. - Tim
| |||
April 22, 2014 Re: Named template constraints | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Tim Holzschuh | On 04/22/2014 07:07 AM, Tim Holzschuh via Digitalmars-d-learn wrote:
> read the 'More Templates' chapter of Ali's book (<-- thanks
> for that ;) ).
Yay! :)
> At the section 'Named constraints', there were a definition like this:
>
> template isUsable(T)
> {
> enum isUsable = is ( typeof(
> {
> T obj;
> obj.call();
> obj.otherCall(1);
> obj.ye tAnotherCall();
> }() ) );
> }
That is how Phobos used to be.
> But at Phobos I always see definitions like this (std.range :
> isInputRange):
>
> template isInputRange(R)
> {
> enum bool isInputRange = is(typeof(
> (inout int = 0)
I had noticed that as well and am curious myself. My guess is that it is a syntax issue where that default parameter list makes it a stronger delegate syntax. :p
> {
> R r = R.init; // can define a range object
> if (r.empty) {} // can test for empty
> r.popFront(); // can invoke popFront()
> auto h = r.front; // can get the front of the range
> }));
> } What does (inout int = 0) mean/affect here? I created the same
> template for myself just without the (inout int = 0) and it worked (at
> least with a dummy struct).. - Tim
Same here: I cannot find an example where the first version does not work. (?)
Ali
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply