On Monday, 17 June 2013 at 00:27:07 UTC, David Nadlinger wrote:
The fix is simple: Replace `mixin(T.stringof ~ ".init")` by `return mixin("T.init")`.

Eh that doesn't seem to work in a more complex case... here's something that tries to implement an interface with stubs. The hard part is the arguments of the members:

====

module a;

auto magic(Interface)() {
        import std.traits;
        template passthrough(T) { alias passthrough = T; }
        string makeCode() {
                string code = "class Class : Interface {";
foreach(memIdx, member; __traits(allMembers, Interface)) {
                        import std.conv;
                        string args;
foreach(idx, arg; ParameterTypeTuple!(__traits(getMember, Interface, member))) {
                                if(idx) args ~= ",";
//args ~= arg.stringof ~ " arg" ~ to!string(idx);

                                // trying to use local names
args ~= "passthrough!(ParameterTypeTuple!(__traits(getMember, Interface, \""~member~"\"))[" ~ to!string(idx) ~ "]) arg" ~ to! string(idx);
                        }
code ~= "override ReturnType!(__traits(getMember, Interface, \""~member~"\")) " ~ member ~ "(" ~ args ~ ") {}";
                }

                code ~= "}";
                return code;
        }

        pragma(msg, makeCode());
        mixin(makeCode());
        return new Class();
}

=====

module b;

struct S{};
interface Test { void foo(S s); }

void main() {
   import a;
   auto s = magic!Test();
}

===


The stringof doesn't work because the name is unknown. But the longer one, currently uncommented, doesn't seem to work either. dmd just dumps a whole lot of trash errors referencing phobos and nothing specifically about this code... eyeballing it, I don't think I screwed it up though.


Is this the right principle at least?

Reply via email to