了解 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 被限制为一种类型的值,因为我无法轻易想象一个字符串和一个整数值有很多共同点.因此,是否期望程序员检查传递的变量类型,然后编写代码来分别处理字符串或整数的情况?创建大型函数体真的更高效吗?我意识到我对模板的不熟悉是显而易见的。因此我的问题:)
"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 没有太多共同点,但您将能够为它们各自创建一个容器。
另一个例子是数学向量,您可以在其中指定使用的类型。您可以指定数学函数,而无需将自己限制为单一类型,如果它们重载了必要的运算符,它们甚至可以使用自定义类型。
我正在自学 '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 被限制为一种类型的值,因为我无法轻易想象一个字符串和一个整数值有很多共同点.因此,是否期望程序员检查传递的变量类型,然后编写代码来分别处理字符串或整数的情况?创建大型函数体真的更高效吗?我意识到我对模板的不熟悉是显而易见的。因此我的问题:)
"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 没有太多共同点,但您将能够为它们各自创建一个容器。
另一个例子是数学向量,您可以在其中指定使用的类型。您可以指定数学函数,而无需将自己限制为单一类型,如果它们重载了必要的运算符,它们甚至可以使用自定义类型。