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 if
và is
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. { {
và } }
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.
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.
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.