📅  最后修改于: 2020-11-04 05:16:30             🧑  作者: Mango
模板是通用编程的基础,它涉及以独立于任何特定类型的方式编写代码。
模板是用于创建通用类或函数的蓝图或公式。
模板是允许将代码描述为模式的功能,以便编译器自动生成程序代码。可以将部分源代码留给编译器填充,直到该部分在程序中实际使用为止。编译器填充缺少的部分。
将函数定义为模板会将其使用的一种或多种类型保留为未指定状态,以便稍后由编译器推导。模板参数列表中定义了未指定的类型,该参数介于函数名称和函数参数列表之间。因此,函数模板具有两个参数列表-
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