Is there a way to copy parameters from a passed function as an alias.

Ex:

void foo(alias fun)(...);

where ... should be the parameters of fun.

Of course std.traits.Parameters works like:

void foo(alias fun)(Parameters!fun);

But the catch is that you don't get the identifiers.

So what is the next alternative?

Okay let's just make it a template then ..

template foo(alias fun)
{
static const parameterTypes = Parameters!(fun).stringof[1..$-1].split(", ");
  static const parameterNames = [ParameterIdentifierTuple!(fun)];

  private string generateParameters()
  {
    string[] s = [];

    static foreach (i; 0 .. parameterTypes.length)
    {
      s ~= parameterType[i] ~ " " ~ parameterNames[i];
    }

    return s.join(",");
  }

  void foo(mixin(generateParameters()))
  {
    ...
  }
}

Hmmm well this doesn't work because mixin cannot be placed there.

So the next alternative is a long ugly mixin like:

template foo(alias fun)
{
static const parameterTypes = Parameters!(fun).stringof[1..$-1].split(", ");
  static const parameterNames = [ParameterIdentifierTuple!(fun)];

  private string generateParameters()
  {
    string[] s = [];

    static foreach (i; 0 .. parameterTypes.length)
    {
      s ~= parameterTypes[i] ~ " " ~ parameterNames[i];
    }

    return s.join(",");
  }

  mixin("void foo(" ~ generateParameters() ~ ") {" ~ q{
    ...
  } ~ "}");
}

There must be a better way to do this.

Ex.

class Foo
{
  void a(int b, int c) { }
}

When passed to foo like "foo!(Foo.a)" should produce:

void foo(int b, int c)
{
  ...
}

Reply via email to