了解 D 中的模板

Understanding templating in D

我正在自学 'D' 我遇到了一个关于模板的问题,这对某些人来说似乎很基础。比如我现在正在阅读的文章(请看这篇post的底部)包含如下代码:

int foo(int x)
{
    return x;
}

string foo(string x)
{
    return x;
}

void main()
{
    assert(foo(12345) == 12345);
    assert(foo("hello") == "hello");
}

显然,这个特定的片段不够优雅,模板可以消除重复:

foo(T)(T x)
{
    return x;
}

void main()
{
    assert(foo!(int)(12345) == 12345);
    assert(foo!(string)("hello") == "hello");
}

第二个示例相当基础,因为我们只是返回传递的值。我的困惑来自于函数,无论多么模板化,仍然 appears 被限制为一种类型的值,因为我无法轻易想象一个字符串和一个整数值有很多共同点.因此,是否期望程序员检查传递的变量类型,然后编写代码来分别处理字符串或整数的情况?创建大型函数体真的更高效吗?我意识到我对模板的不熟悉是显而易见的。因此我的问题:)

http://nomad.so/2013/07/templates-in-d-explained/

"template" 的字面定义是 "something that serves as a model for others to copy",这就是编译器所做的。对于每种类型(在您的情况下为 string 和 int),它会复制模板函数并在编译期间创建一个专门的函数。

在运行时不需要模板,所以编译后可以扔掉。在编译后的二进制文件中有两个函数foo!(int)foo!(string).

Is a programmer expected to check for the type of variable passed and then write code to handle cases of string or integer separately?

这取决于。有时您想这样做。例如,优化性能。有时您不需要这样做并编写通用函数。

Is creating a large function body truly more efficient?

有时。如果没有,那就不要这样做。例如,您可以编写 one 通用 find 函数,它适用于数组、链表和类似的东西。

模板是您希望平等处理的类型的可重用代码。因此,如果您想要 'to handle cases of string or integer separately'.

,它们可能不是正确的工具

以任意容器为例,其中包含T个元素。尽管 string 和 int 没有太多共同点,但您将能够为它们各自创建一个容器。

另一个例子是数学向量,您可以在其中指定使用的类型。您可以指定数学函数,而无需将自己限制为单一类型,如果它们重载了必要的运算符,它们甚至可以使用自定义类型。