Tôi đang cố gửi chức năng sort
của D làm đối số mẫu cho hàm pipe
. Khi tôi sử dụng sort
không có đối số mẫu hoạt động: Gửi một chức năng được tạo khuôn mẫu làm đối số cho một chức năng được tạo khuôn mẫu trong D
import std.stdio,std.algorithm,std.functional;
void main()
{
auto arr=pipe!(sort)([1,3,2]);
writeln(arr);
}
Tuy nhiên, khi tôi cố gắng sử dụng sort
với một mẫu đối số:
import std.stdio,std.algorithm,std.functional;
void main()
{
auto arr=pipe!(sort!"b<a")([1,3,2]);
writeln(arr);
}
tôi nhận được một lỗi - main.d(5): Error: template instance sort!("b<a") sort!("b<a") does not match template declaration sort(alias less = "a < b",SwapStrategy ss = SwapStrategy.unstable,Range)
Tại sao nó lại xảy ra? sort!"b<a"
hoạt động trên chính nó và có cùng các đối số và kiểu trả về là sort
, vậy tại sao pipe
chấp nhận sort
nhưng không phải sort!"b<a"
? Và có cú pháp chính xác cho những gì tôi cố gắng làm không?
CẬP NHẬT
OK, tôi đã cố gắng để quấn sort
chức năng. Các mã sau đây hoạt động:
import std.stdio,std.algorithm,std.functional,std.array;
template mysort(string comparer)
{
auto mysort(T)(T source)
{
sort!comparer(source);
return source;
}
}
void main()
{
auto arr=pipe!(mysort!"b<a")([1,3,2]);
writeln(arr);
}
Vì vậy, tại sao không phải là phiên bản gốc làm việc? có phải vì các thông số mẫu bổ sung sort
không?
Tôi hiểu ... Tôi đã tìm ra mẫu 'pipe', ngầm nhận được kiểu đối số dưới dạng tham số mẫu, nên chuyển tham số đó tới hàm piped đầu tiên, nhưng tôi thấy điều đó không đúng. –
@IdanArye: 'pipe' không bao giờ có thể làm điều đó, bởi vì ta có thể tách nó ra khỏi đối số (' alias pipe! (F) piped; 'và sau đó nhiều dòng sau' piped ([1,2,3]); ') – kennytm
Không nên 'alias'ing như vậy làm cho' piped' một chức năng templated chính nó? –