Tôi đã quên rằng những loại variadics thậm chí tồn tại D. Tôi không nghĩ rằng TDPL thậm chí đề cập đến chúng. Tôi tin rằng điều đó làm cho một tổng cộng của 4 loại khác nhau của variadics trong D.
C variadics
extern(C) void func(string format, ...) {...}
D variadics với TypeInfo
void func(string format, ...) {...}
variadics đồng nhất sử dụng mảng
void func(string format, string[] args...) {...}
variadics không đồng nhất với các mẫu thiết variadics
void func(T...)(string format, args) {...}
Tôi tin rằng TDPL thực sự chỉ nói về # 3 và # 4, và đó là tất cả mà tôi thường sử dụng, vì vậy tôi sẽ phải đi đào bới để tìm ra cách vượt qua đối số bằng cách sử dụng # 2. Tôi hy vọng rằng nó tương tự như cách bạn làm điều đó trong C với # 1, nhưng tôi không biết.
Tuy nhiên, thật dễ dàng với # 3 và # 4. Trong cả hai trường hợp, bạn chỉ cần vượt qua args
cho bất kỳ chức năng nào bạn muốn chuyển. Và cả hai đều cho phép lập chỉ mục và cắt (ví dụ: args[1]
và args[1 .. $]
) cũng như có thuộc tính length
. Vì vậy, chúng dễ sử dụng, và phần lớn, chúng là cách tốt hơn để đi. Các ngoại lệ duy nhất mà tôi có thể nghĩ đến là nếu bạn đang gọi hàm C hiện có (trong trường hợp này, bạn sử dụng # 1) hoặc nếu bạn cần mẫu không đồng nhất và không đủ khả năng tăng kích thước nhị phân mà mẫu tạo (trong đó trường hợp bạn sử dụng # 2), điều này thực sự chỉ là một vấn đề trong môi trường nhúng. Nói chung, # 3 và # 4 và chỉ là giải pháp đơn giản hơn.
Nguồn
2011-09-23 21:24:32
Cảm ơn tất cả, nó chỉ ra các mẫu giải quyết vấn đề rất sạch sẽ và thanh lịch. Tiền thưởng được thêm vào: nó không gây ra bất kỳ sự phân bổ bộ nhớ nào, do đó nó có thể được gọi từ các destructors (đó là một hàm từ một mô-đun ghi nhật ký). –