如何从so/dll获取模板函数?

How to get template function from so/dll?

如何从so/dll获取模板函数? 我试过了:

Library libdll;
T abc(T)();
static this()
{
    libdll = Library("libs/libdll.so");
    abc = cast(typeof(abc)) libdll.loadSymbol!(typeof(abc))("dll.abc");
    //abc();
}

但是abc的类型被确定为void。 我在编译中遇到错误:

Error: expression `cast(void)dlsym(this.handle, toStringz(cast(const(char)[])m))` is `void` and has no value

m - 是 dll.abc 的错位名称。

D 中的模板是仅编译时构造,sos/dlls 中不存在。特定实例最终出现在 so 中,但只有那些在那里使用的实例。换句话说,如果您在 so/dll:

中有此代码
module dll;

T abc(T)() {
    T result = void;
    return result;
}

void use() {
    auto var = abc!int();
}

您应该能够从 so/dll.

中获取 dll.abc!int.abc(损坏的名称 _D3dll__T3abcTiZQhFNaNbNiNfZi

如果你想用其他类型调用 abc,比如 abc!string,那你就不走运了——代码不存在。

这涵盖了可行性。如果您只想要一个您知道已实例化的特定实例,那么这里还有另一个问题,即 typeof(abc) 的使用。同样,abc 是编译时的东西,没有类型。令人困惑的是,编译器 returns void for typeof(abc),给你错误信息 is `void` and has no value.

abc!int 是一个函数,并且确实有一个类型 (pure nothrow @nogc @safe int()),因此使用它应该有效。如上所述,名称将是 dll.abc!int.abc(它是一个 eponymous template,因此是重复的名称)。

TL;DR:如果您想要模板的特定实例,并且已在 so/dll 中实例化,此代码应该有效(但尚未经过测试):

Library libdll;
T abc(T)();
static this()
{
    libdll = Library("libs/libdll.so");
    abc = cast(typeof(abc!int)) libdll.loadSymbol!(typeof(abc!int))("dll.abc!int.abc");
    abc();
}