2016-01-28 13 views
9

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. 
+5

Bạn đã xem xét các đề xuất khái niệm cho C++ 1Z/C++ 2x? – Yakk

+0

@Yakk, cảm ơn - Tôi không theo dõi các khái niệm ở đâu. Sẽ đọc lên. –

+3

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). –

Trả lời

10

Nó thực sự gần như ở cửa là một phần của tính năng Concepts, và một số trình biên dịch đã thực hiện nó! Ví dụ, với GCC 4.9, nếu bạn chỉ định -std=c++1y, bạn có thể thực sự biên dịch và chạy như sau:

auto print_arg(auto arg) { 
    std::cout << arg; 
} 
+0

Cảm ơn! không nhận thức được điều đó chút nào. –

+1

Và sau này, chúng ta sẽ loại bỏ từ khóa 'auto' :) – Pierre

+2

@Pierre Có một số cuộc thảo luận xung quanh, lần cuối tôi đã kiểm tra, đơn giản hóa phạm vi dựa trên đơn giản là' for (v: V) ' có thể tương đương với 'for (auto && v: V)'. –

Các vấn đề liên quan