On Friday, 1 May 2020 at 20:28:58 UTC, Jean-Louis Leroy wrote:
Is it possible, inside a function template, to create an alias
to the instantiated function? IOW the equivalent of
__FUNCTION__, but yielding an alias?
The closest I came is:
import std.string;
import std.traits;
void foo(T)(lazy T)
{
mixin(
"alias thisFunction = ",
__FUNCTION__[0..__FUNCTION__.lastIndexOf('.')],
";");
pragma(msg, Parameters!thisFunction);
}
void main()
{
foo(0);
foo("");
}
dmd -c aliasthisfunction.d
(lazy int)
(lazy string)
...but (unsurprisingly) this fails in presence of overloads.
I.e. if I throw in:
void foo(T)(int, T);
...then I get:
aliasthisfunction.d(6): Error: template
`aliasthisfunction.foo` matches more than one template
declaration:
aliasthisfunction.d(4): `foo(T)(lazy T)`
and
aliasthisfunction.d(20): `foo(T)(int, T)`
...
Something I have overlooked? Any ideas?
This should work:
alias context(alias a) = __traits(parent, a);
void fun() {
alias ctx = context!({})();
}
{} becomes a lambda inside fun(), so it's parent is fun(). The
same could be done by introducing a symbol explicitly, but that
pollutes the namespace. This template works inside functions,
methods, lambdas, modules, structs, classes and interfaces.
--
Simen