Le 12/03/2018 à 23:24, Xavier Bigand a écrit :
Le 12/03/2018 à 22:30, arturg a écrit :
On Monday, 12 March 2018 at 21:00:07 UTC, Xavier Bigand wrote:
Hi,

I have a CTFE function that I want to make more generic by given it a
module as parameter.


My actual code looks like :

mixin(implementFunctionsOf());


string implementFunctionsOf()
{
    import std.traits;

    string    res;

    foreach(name; __traits(allMembers, myHardCodedModule))
    {
    }
    return res;
}


I tried many things but I can't figure out the type of the parameter I
should use for the function implementFunctionsOf.

you can use a alias or a string:

void fun(alias mod, string mod2)()
{
    foreach(m; __traits(allMembers, mod))
        pragma(msg, m);

    foreach(m; __traits(allMembers, mixin(mod2)))
        pragma(msg, m);
}

void main()
{
    import std.stdio;
    fun!(std.stdio, "std.stdio");
}


I tried both without success,


Here is my full code :

module api_entry;

import std.stdio : writeln;
import std.algorithm.searching;

import derelict.opengl3.functions;

import std.traits;

string implementFunctionsOf(string mod)
{
    import std.traits;

    string    res;

    static foreach(name; __traits(allMembers, mixin(mod)))
    {
        static if (mixin("isCallable!" ~ name)
                   && name.startsWith("da_"))
        {
            string oglFunctionName = name[3..$];
            string returnType = ReturnType!(mixin(name)).stringof;
            string parametersType = Parameters!(mixin(name)).stringof;

            res ~=
                "export\n" ~
                "extern (C)\n" ~
                returnType ~ "\n" ~
                oglFunctionName ~
                parametersType ~ "\n" ~
                "{\n" ~
                "   writeln(\"" ~ oglFunctionName ~ "\");\n";

            static if (ReturnType!(mixin(name)).stringof != "void")
            {
                res ~=
                    "   " ~ returnType ~ " result;\n" ~
                    "   return result;";
            }
            res ~=
                "}\n";
        }
    }
    return res;
}

mixin(implementFunctionsOf("derelict.opengl3.functions"));


As string I get the following error:
..\src\api_entry.d(16): Error: variable `mod` cannot be read at compile
time
..\src\api_entry.d(48):        called from here:
`implementFunctionsOf("derelict.opengl3.functions")`




I also tried to make implementFunctionsOf a mixin template.


I forgot to precise, that I don't have a main, because I am trying to create an opengl32.dll. This is why I already have a mixin to inject to function definitions in the root scope.

Reply via email to