On Tuesday, 1 May 2012 at 16:56:48 UTC, Alex Rønne Petersen
wrote:
Yes, creating manual bindings is tedious and annoying to
maintain, but
it is the most foolproof approach.
In another language there may not be other exit but D, i am
not sure.
As it happens, you are safe with D even if you pick that path.
With my limited knowledge, these a few lines of code destroys
all lua binders out there. Make sure they are inlined and it
would be identical to handcrafted bindings.
WARNING: DO NOT TRY THIS WITH C++! (See the "alias F"?
ParamTuple? Yep)
import std.stdio;
import std.traits;
struct handle {
int i=0;
int get_arg() {
return i++;
}
}
alias handle* hnd;
void assign(uint N, P...)(ref P p, hnd h)
{
static if(N)
{
p[N-1] = h.get_arg();
assign!(N-1)(p, h);
}
}
int fn(alias F)(hnd h)
{
alias ParameterTypeTuple!(typeof(&F)) P;
P p;
assign!(P.length)(p, h);
F(p);
return 0;
}
// test >>>>
void fun0(int a)
{
writeln("fun0 a: ", a);
}
void fun1(int a, int b)
{
writeln("fun1 a: ", a);
writeln("fun1 b: ", b);
}
void main()
{
// reg(&fn!fun0, "fun0");
// reg(&fn!fun1, "fun1");
auto f0 = &fn!fun0;
auto f1 = &fn!fun1;
handle h;
f0(&h);
f1(&h);
}
// test <<<<