コンテンツにスキップ

D言語/ジェネリックス

出典: フリー教科書『ウィキブックス(Wikibooks)』

D言語は、静的型付け言語であり、強力なメタプログラミング機能を備えています。そのため、D言語は、汎用的なアルゴリズムを作成するための非常に強力なツールとなります。

ジェネリックプログラミングは、汎用的なアルゴリズムを記述するためのプログラミング手法であり、C++やJavaなどの言語でもサポートされています。ジェネリックプログラミングは、型安全性が高く、パフォーマンスの向上にも貢献します。

この章では、D言語でジェネリックプログラミングを行う方法について説明します。ジェネリック機能により、同じアルゴリズムを異なるデータ型に対して使用できるため、プログラムの再利用性が高まります。さらに、D言語のジェネリックプログラミング機能は、メタプログラミングをサポートするため、より高度なプログラミング技術を実現することができます。

この章を読むことで、D言語でジェネリックプログラミングを行うための基本的な概念や、ジェネリック機能の使用方法、ジェネリックテンプレートの作成方法などを理解することができます。

ジェネリックなダブルリンクドリスト

[編集]

以下は、D言語でジェネリックなダブルリンクドリストを実装する例です。

gendbllink.d
import std.stdio;

struct Node(T) {
    T value;
    Node!(T)* prev;
    Node!(T)* next;
}

class DoublyLinkedList(T) {
    private Node!(T)* head;
    private Node!(T)* tail;
    private size_t length;

    public void add(T value) {
        Node!(T)* node = new Node!(T)(value);
        if (head is null) {
            head = tail = node;
        } else {
            tail.next = node;
            node.prev = tail;
            tail = node;
        }
        ++length;
    }

    public void remove(T value) {
        Node!(T)* current = head;
        while (current !is null) {
            if (current.value == value) {
                if (current.prev is null) {
                    head = current.next;
                } else {
                    current.prev.next = current.next;
                }
                if (current.next is null) {
                    tail = current.prev;
                } else {
                    current.next.prev = current.prev;
                }
                --length;
                return;
            }
            current = current.next;
        }
    }

    public void print() {
        Node!(T)* current = head;
        while (current !is null) {
            writef("%s ", current.value);
            current = current.next;
        }
        writeln();
    }
}

void main() {
    DoublyLinkedList!(int) list = new DoublyLinkedList!(int);
    list.add(1);
    list.add(2);
    list.add(3);
    list.print(); // Output: 1 2 3
    list.remove(2);
    list.print(); // Output: 1 3
}
実行結果
1 2 3  
1 3
この実装では、ジェネリックなダブルリンクドリストを定義するために、Node構造体をジェネリックにし、DoublyLinkedListクラスの型パラメータに渡すことによって、任意の型の要素を格納できるようにしています。また、add、remove、printメソッドを提供しています。