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

Reply via email to