发布于 2015-08-16 14:55:20 | 203 次阅读 | 评论: 0 | 来源: 网络整理
模板是泛型编程,涉及编写代码的方式,独立于任何特定类型的基础。
模板是蓝图或公式创建一个泛型类或函数。
模板的功能,允许描述的代码作为一种模式,让编译器自动生成的程序代码。的源代码部分可留至要填充,直到该部分是在程序实际使用的编译器。编译器填补了缺失的部分。
定义一个函数作为模板离开一个或多个使用作为非特定的类型,可以由编译器后面推导出来。正在未指定的类型模板形参表上,它的函数的名称,函数参数列表之间进行定义。出于这个原因,函数模板有两个参数列表:模板形参表和函数参数列表:
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