Nhiều năm trước, (ít nhất là đối với tôi), đa hình tĩnh C++ dường như mạch lạc. Ngôn ngữ như Python dựa vào duck typing, nơi bạn có:Tại sao C++ 1 * Vẫn cần từ khóa mẫu trong trường hợp đánh số vịt đầy đủ
def fn(foo, bar):
foo.baz(bar.bo())
và ý tưởng là nếu nó "quacked" một cách thích hợp, nó là tốt bởi ngôn ngữ.
Trong C++, ngược lại, bạn sẽ phải giải thích những gì "động vật" đó là:
void fn(foo_type foo, bar_type bar);
và cho "vương quốc của các gia đình", bạn muốn một cách rõ ràng cần phải sử dụng các từ khóa template
:
template<class Foo, class Bar>
void fn(Foo foo, Bar bar);
với những tính năng mới như auto ...() -> decltype
kiểu trả về, nhưng đặc biệt là generic lambdas, dường như có một cái gì đó nhiều hơn nữa như không mẫu Python giống như du ck gõ:
[] (auto container) { return container.size(); };
Câu hỏi của tôi, sau đó, là tại sao là từ khóa template
vẫn cần thiết? Tại sao không nắm lấy chỉ đầy đủ (không bắt buộc) gõ vịt:
// Takes a foo_type and a bar_type
void fn(foo_type foo, bar_type bar);
// Takes some "foo-quacking" type, and a bar_type
void fn(auto foo, bar_type bar);
// Etc.
Bạn đã xem xét các đề xuất khái niệm cho C++ 1Z/C++ 2x? – Yakk
@Yakk, cảm ơn - Tôi không theo dõi các khái niệm ở đâu. Sẽ đọc lên. –
Nó đang đến, nhưng không phải mọi thứ xảy ra cùng một lúc. Trong C++ 11, chúng ta đã suy ra các kiểu trả về cho lambdas, sau đó trong C++ 14 chúng ta đã nhận chúng cho tất cả các hàm. Trong C++ 14, chúng ta có lambdas chung (tức là 'tham số' tự động) và khái niệm TS bổ sung giống nhau cho các hàm bình thường (hàm này ngầm trở thành mẫu hàm và được khởi tạo cho đối số đã cung cấp). –