How do you call an eponymous template that has a secondary template arg?
aliak
something at something.com
Sun Mar 11 22:35:41 UTC 2018
On Sunday, 11 March 2018 at 13:44:38 UTC, Basile B. wrote:
>
> The first version works here:
>
> ```
> template aliasOf(T) {
> enum aliasOf(alias a) = is(typeof(a) == T);
> }
>
> string s;
>
> pragma(msg, allSatisfy!(aliasOf!string, s, "string"));
> ```
>
I can see that my description was a little confusing, sorry about
that, I meant to ask how would you call that without using the
allSatisfy meta template. If I were to call it as a stand alone,
ie:
writeln(aliasOf!string<how do I pass argument to inner
template?>);
I hope that makes it clearer.
> Now on the fact that what is done is correct is another story.
> If the literal passed is supposed to be a type then it's
> clearly wrong.
> You'd have to mix it:
>
> ```
> template aliasOf(T)
> {
> template aliasOf(alias a)
> {
> mixin("alias A = " ~ a ~ ";");
> enum aliasOf = is(A == T);
> }
> }
>
> alias myString1 = string;
> alias myString2 = string;
>
> pragma(msg, allSatisfy!(aliasOf!string, "myString1",
> "myString2"));
> ```
Aye, I see what you mean, but it is supposed to be a literal of a
specific type. I.e. 3, "some string", SomeType(), etc.
So aliasOf!int.aliasOf!3 // true
Also, if I define it like this:
template aliasOf(T) {
auto aliasOf(U)(U) { return is(U == T); }
}
Then at least I can call it like:
writeln(aliasOf!int(3)); // prints true
But then I can't do:
allSatisfy!(aliasOf!int, 3)
I guess because it's a function now and not a template anymore so
can't be used by allSatisfy.
More information about the Digitalmars-d-learn
mailing list