Lập trình mẫu meta

Nếu bạn từng làm quen với template meta programming (lập trình mẫu meta) trong C++ bạn sẽ thấy trong D mọi việc còn dễ dàng hơn nữa. Lập trình mẫu meta là kỹ thuật cho phép đưa ra các quyết định dựa vào kiểu của mẫu, nhờ đó làm cho các kiểu tổng quát uyển chuyển hơn.

static ifis

Giống như if, nhưng static if được kiểm tra lúc biên dịch chương trình:

static if(is(T == int))
    writeln("T kiểu int");
static if (is(typeof(x) :  int))
    writeln("Biến x được ép qua kiểu int");

Biểu thức is giúp xác định các điều kiện lúc biên dịch chương trình:

static if(is(T == int)) { // T là tham số mẫu
    int x = 10;
}

Dấu ngoặc được bỏ qua nếu điều kiện là true - không có khỗi mã nào được tạo ra. { {} } tạo ra các khối mã một cách tường minh.

static if có thể được dùng khắp nơi trong chương trình, trong các hàm, ở phạm vi toàn cục hay trong định nghĩa của kiểu.

Mẫu mixin

Khi nào bạn thấy boiler plate, thì mẫu mixin có thể giúp:

mixin template Foo(T) {
    T foo;
}
...
mixin Foo!int; // Foo kiểu int có hiệu lực từ đây.

Mẫu mixin có thể gồm các biểu thức phức tạp được chèn vào nơi mẫu được gọi đến. Bạn không cần phép tiền xử lý từ C nữa.

Ràng buộc mẫu

Một mẫu có thể được định nghĩa với số lượng tùy ý các ràng buộc cần có cho các thuộc tính của kiểu:

void foo(T)(T value)
  if (is(T : int)) { // foo!T chỉ áp dụng được
                     // khi T ép qua kiểu int được
}

Ràng buộc có thể được viết bằng kết hợp biểu thức Boolean hay thậm chí các hàm có thể định giá lúc biên dịch. Ví dụ, hàm std.range.primitives.isRandomAccessRange kiểm tra xem một kiểu có phải là một dải hỗ trợ toán tử [] không.

Nâng cao

Tham khảo cơ bản

Tham khảo nâng cao

rdmd playground.d