gpt4 book ai didi

templates - 不同源文件中的 D 模板特化

转载 作者:行者123 更新时间:2023-12-02 19:16:10 25 4
gpt4 key购买 nike

我最近问过this有关如何在 D 中模拟类型类的问题,并建议了一种使用模板专门化来实现此目的的方法。

我发现 D 无法识别不同源文件中的模板专门化。因此,我不能只对未包含在定义通用函数的文件中的文件进行专门化。为了说明这一点,请考虑以下示例:

//template.d
import std.stdio;
template Generic(A) {
void sayHello() {
writefln("Generic");
}
}

void testTemplate(A)() {
Generic!A.sayHello();
}


//specialization.d
import std.stdio;
import Template;

template Generic(A:int) {
void sayHello() {
writefln("only for ints");
}
}

void main() {
testTemplate!int();
}

当我运行此代码时,它会打印“generic”。所以我想问是否有一些好的解决方法,以便可以从算法中使用更专门的形式。

我在有关类型类的问题中使用的解决方法是在导入具有模板特化的所有文件后混合通用函数,但这有点丑陋且有限。

我听说 c++1x 将有 extern 模板,这将允许这样做。 D 有类似的功能吗?

最佳答案

对于这个问题,我想我可以给出一个正确的答案。没有。

您想要做的是劫持 template.d 的功能(文件上的大小写也应该匹配并导入模板,某些操作系统很重要)。考虑:

// template.d
...

// spezialisation.d
import std.stdio;
import template;

void main() {
testTemplate!int();
}

现在有人更新了代码:

// specialization.d
import std.stdio;
import template;
import helper;

void main() {
testTemplate!int();
getUserData();
}

完美吧?井内助手:

// helper.d
getUserData() { ... }


template Generic(A:int) {
A placeholder; //...
}

您现在仅通过导入更改了 professionalization.d 的行为,实际上这将无法编译,因为它无法调用 sayHello。这种劫持预防确实有其问题。例如,您可能有一个接受 Range 的函数,但库的使用者无法传递数组,除非您的库导入 std.array,因为这是数组“转换”为范围的地方。

我没有解决您的问题的方法。

Michal 的评论为第二种形式的劫持提供了解决方案,其中表示 professionalization.d 试图劫持 getUserData

// specialization.d
import std.stdio;
import template;
import helper;

alias helper.getUserData getUserData;

string getUserData(int num) { ... }

void main() {
testTemplate!int();
getUserData();
}

关于templates - 不同源文件中的 D 模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6362280/

25 4 0