Trong D, phần lớn, lập trình meta chỉ là lập trình. Không cần bất kỳ thư viện nào như boost.mpl
Ví dụ, hãy xem xét độ dài bạn sẽ phải đi đến trong C++ để sắp xếp một dãy số tại thời gian biên dịch. Trong D, bạn chỉ cần làm điều rõ ràng: sử dụng std.algorithm.sort
import std.algorithm;
int[] sorted(int[] xs)
{
int[] ys = xs.dup;
sort(ys);
return ys;
}
pragma(msg, sorted([2, 1, 3]));
này in ra [1, 2, 3]
tại thời gian biên dịch. Lưu ý: sort
không được tích hợp vào ngôn ngữ và hoàn toàn không có mã đặc biệt để làm việc tại thời gian biên dịch.
Đây là một ví dụ khác xây dựng bảng tra cứu cho chuỗi Fibonacci tại thời gian biên dịch.
int[] fibs(int n)
{
auto fib = recurrence!("a[n-1] + a[n-2]")(1, 1);
int[] ret = new int[n];
copy(fib.take(n), ret);
return ret;
}
immutable int[] fibLUT = fibs(10).assumeUnique();
Ở đây, fibLUT
được xây dựng hoàn toàn tại thời gian biên dịch, không cần bất kỳ mã thời gian biên dịch đặc biệt nào.
Nếu bạn muốn làm việc với các loại, có một vài chức năng meta loại trong std.typetuple
. Ví dụ:
static assert(is(Filter!(isUnsigned, int, byte, ubyte, dstring, dchar, uint, ulong) ==
TypeTuple!(ubyte, uint, ulong)));
Thư viện đó, tôi tin rằng, chứa hầu hết các chức năng bạn có thể nhận được từ Fusion. Hãy nhớ rằng mặc dù, bạn thực sự không cần phải sử dụng nhiều mẫu meta-lập trình công cụ trong D nhiều như bạn làm trong C + +, bởi vì hầu hết các ngôn ngữ có sẵn tại thời gian biên dịch anyway.
Tôi thực sự không thể nhận xét về hiệu suất vì tôi không có trải nghiệm rộng lớn với cả hai. Tuy nhiên, bản năng của tôi sẽ là thời gian thực hiện biên dịch của D nhanh hơn vì bạn thường không cần phải thực hiện nhiều mẫu. Tất nhiên, các trình biên dịch C++ đã trưởng thành hơn, vì vậy tôi có thể sai ở đây. Cách duy nhất bạn sẽ thực sự tìm ra là bằng cách thử nó cho trường hợp sử dụng cụ thể của bạn.
Bạn không thực sự cần * lập trình meta metaprogram; D có đánh giá hàm thời gian biên dịch. – Mehrdad
@Mehrdad cho mọi thứ? bạn có thể làm find_if hoặc biến đổi trên các tham số mẫu? –
Không phải cho tất cả mọi thứ (vẫn còn lỗi để được cố định), nhưng đối với khá nhiều thứ. Thật khó để đưa ra một câu trả lời chung chung nhưng nếu bạn có một ví dụ cụ thể xin vui lòng gửi nó và tôi sẽ xem nếu tôi có thể tìm thấy một phiên bản CTFE của nó và cho bạn thấy. – Mehrdad