template auto value
Jonathan Marler
johnnymarler at gmail.com
Mon Mar 5 15:47:20 UTC 2018
On Monday, 5 March 2018 at 13:03:50 UTC, Steven Schveighoffer
wrote:
> On 3/2/18 8:49 PM, Jonathan Marler wrote:
>> On Saturday, 3 March 2018 at 00:20:14 UTC, H. S. Teoh wrote:
>>> On Fri, Mar 02, 2018 at 11:51:08PM +0000, Jonathan Marler via
>>> Digitalmars-d wrote:
>>>> [...]
>>>
>>> Not true:
>>>
>>> template counterexample(alias T) {}
>>>
>>> int x;
>>> string s;
>>> alias U = counterexample!x; // OK
>>> alias V = counterexample!1; // OK
>>> alias W = counterexample!"yup"; // OK
>>> alias X = counterexample!s; // OK
>>>
>>> alias Z = counterexample!int; // NG
>>>
>>> The last one fails because a value is expected, not a type.
>>>
>>> If you *really* want to accept both values and types, `...`
>>> comes to the rescue:
>>>
>>> template rescue(T...) if (T.length == 1) {}
>>>
>>> int x;
>>> string s;
>>> alias U = rescue!x; // OK
>>> alias V = rescue!1; // OK
>>> alias W = rescue!"yup"; // OK
>>> alias X = rescue!s; // OK
>>> alias Z = rescue!int; // OK!
>>>
>>>
>>> T
>>
>> Ah thank you...I guess I didn't realize that literals like 1
>> and "yup" were considered "symbols" when it comes to alias
>> template parameters.
>
> Well, they aren't. But template alias is a bit of a mess when
> it comes to the spec. It will accept anything except keywords
> AFAIK. Would be nice if it just worked like the variadic
> version.
>
> The variadic version is what is usually needed (you see a lot
> of if(T.length == 1) in std.traits).
>
> But, if you wanted to ensure values (which is more akin to your
> proposal), you can do:
>
> template rescue(alias val) if(!is(val)) // not a type
>
> -Steve
Thanks for the tip, it looks like the spec does mention
"literals" but "alias" parameters are even more versatile than
that
(https://dlang.org/spec/template.html#TemplateAliasParameter).
For example you can pass a function call. I've created an issue
to make sure we update the spec to reflect the true capabilities:
https://issues.dlang.org/show_bug.cgi?id=18558
More information about the Digitalmars-d
mailing list