templates - 类的 Dlang 泛型

标签 templates generics d

第一次海报。我已经使用 Java 几年了,并决定学习 D。在 Java 中,您可以声明一个具有泛型类型的类,并从该类创建一个新对象。喜欢:

public class foo<T>
{
    public foo() { ... }
}

然后简单地调用foo<String> f = new foo<>(); .我试图在 D 中实现相同的功能,但出现编译错误,例如:“class core.collection.RingBuffer.RingBuffer(T) is used as a type”。查看D的教程,我发现泛型编程是使用模板实现的。但是,我无法确定官方的正反面 tutorials/docs .有人可以向我解释一下吗?谢谢。

最佳答案

当您没有在右侧实例化模板时会出现该错误 - 它会提示“foo 被用作一种类型”,因为 foo 本身还不是一种类型,它是一种类型的模板。这意味着在用 !(arguments) 实例化之前,它不会成为实际类型。

您的 Java 代码 new foo<>()在 D 中不完全是这样:在 D 中,您需要在右侧给出类型。

所以尝试:

foo!string f = new foo!string();

foo!(string) f = new foo!(string)();

模板参数周围的括号,在 ! 之后, 如果后面只有一个单词,则为可选,因此这两个意思相同。

在 D 中不需要将类型写两次,但与其将其留在右侧,不如通过类型推断将其留在左侧。这也会编译:

auto f = new foo!string();

这在 D 中很常见。

关于templates - 类的 Dlang 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28645999/

相关文章:

c++ - 潜在的 g++ 模板错误?

c++ - 有没有办法专门针对目标原语模板?

Java:实例化一个没有默认构造函数的泛型类

c++ - 如何将N <T>视为N <const T>?

c++ - 什么是奇怪的重复模板模式 (CRTP)?

C# 泛型类型函数,使泛型方法因 System.String 失败

java - 如何在派生内部类中编写构造函数?

c# - 与 D 交互 正确返回一个结构数组

input - 如何在 D 编程语言 + Tango 中抓取单键命中?

gdb - D2和gdb问题