D 语言 - 模板
模板是泛型编程的基础,涉及以独立于任何特定类型的方式编写代码。
模板是用于创建通用类或函数的蓝图或公式。
模板是允许将代码描述为模式的功能,以便编译器自动生成程序代码。 源代码的某些部分可能会留给编译器来填充,直到该部分在程序中实际使用为止。 编译器会填补缺失的部分。
函数模板
将函数定义为模板会保留其使用的一个或多个类型未指定,以便编译器稍后推导。 未指定的类型在模板参数列表中定义,该列表位于函数名称和函数参数列表之间。 因此,函数模板有两个参数列表 −
- 模板参数列表
- 函数参数列表
import std.stdio; void print(T)(T value) { writefln("%s", value); } void main() { print(42); print(1.2); print("test"); }
如果我们编译并运行上面的代码,将会产生以下结果 −
42 1.2 test
具有多个类型参数的函数模板
可以有多种参数类型。 它们如以下示例所示。
import std.stdio; void print(T1, T2)(T1 value1, T2 value2) { writefln(" %s %s", value1, value2); } void main() { print(42, "Test"); print(1.2, 33); }
如果我们编译并运行上面的代码,将会产生以下结果 −
42 Test 1.2 33
类模板
正如我们可以定义函数模板一样,我们也可以定义类模板。 以下示例定义了 Stack 类并实现了从堆栈中压入和弹出元素的通用方法。
import std.stdio; import std.string; class Stack(T) { private: T[] elements; public: void push(T element) { elements ~= element; } void pop() { --elements.length; } T top() const @property { return elements[$ - 1]; } size_t length() const @property { return elements.length; } } void main() { auto stack = new Stack!string; stack.push("Test1"); stack.push("Test2"); writeln(stack.top); writeln(stack.length); stack.pop; writeln(stack.top); writeln(stack.length); }
当上面的代码被编译并执行时,会产生以下结果 −
Test2 2 Test1 1