digitalmars.D.learn - How to reliably detect an alias sequence?
- Max Samukha (11/11) Dec 27 2020 Given a name bound to an alias sequence, what is a reliable way
- sighoya (11/22) Dec 27 2020 This should work:
- Max Samukha (4/14) Dec 27 2020 That will only work for type tuples. We need a general solution
Given a name bound to an alias sequence, what is a reliable way
to detect that?
import std.meta: AliasSeq;
alias a = AliasSeq!int;
static if (<is a an AliasSeq>) {
}
__traits(isSame, a, AliasSeq!a) could work but doesn't, because
it flattens singletons, which means __traits(isSame, int,
AliasSeq!int) is true. (A bug/bad design, IMO. If the intended
behavior is not to flatten tuples passed to __traits, there is no
reason to make a special case for singletons).
Dec 27 2020
On Sunday, 27 December 2020 at 12:23:26 UTC, Max Samukha wrote:
Given a name bound to an alias sequence, what is a reliable way
to detect that?
import std.meta: AliasSeq;
alias a = AliasSeq!int;
static if (<is a an AliasSeq>) {
}
__traits(isSame, a, AliasSeq!a) could work but doesn't, because
it flattens singletons, which means __traits(isSame, int,
AliasSeq!int) is true. (A bug/bad design, IMO. If the intended
behavior is not to flatten tuples passed to __traits, there is
no reason to make a special case for singletons).
This should work:
```
static assert(is(int == AliasSeq!int));
Drepl: static assert: `is(int == (int))` is false
```
The most appropriate solution would be:
```
AliasSeq!int.stringof == (int);
```
But it wouldn't exclude false positives.
Dec 27 2020
On Sunday, 27 December 2020 at 18:25:10 UTC, sighoya wrote:This should work: ``` static assert(is(int == AliasSeq!int)); Drepl: static assert: `is(int == (int))` is false ```That will only work for type tuples. We need a general solution that would work for any alias tuple.The most appropriate solution would be: ``` AliasSeq!int.stringof == (int); ``` But it wouldn't exclude false positivesYes, stringof is inadequate.
Dec 27 2020








Max Samukha <maxsamukha gmail.com>