Copy parameters from function passed as an alias
bauss
jj_1337 at live.dk
Tue Oct 9 14:43:45 UTC 2018
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)
{
...
}
More information about the Digitalmars-d-learn
mailing list