2009-07-17 41 views
6

Khi gọi một hàm mẫu, bạn có thể bỏ qua loại sau tên hàm không?Bỏ qua đối số trong Mẫu C++

Như một ví dụ, hãy xem xét các chức năng

mẫu <typename T> void f (T var) {...};

Is it ok để chỉ đơn giản gọi nó là như thế này:

int x = 5;
f (x);

hoặc tôi để bao gồm loại?

int x = 5;
f <int> (x);

+3

Không thể bạn chỉ cần thử nó và xem những gì sẽ xảy ra? Có vẻ dễ dàng đủ để kiểm tra. –

+6

@ Ed Swangren, Phương pháp "chỉ cần thử" là rất không rõ ràng. Tốt nhất là nó cho bạn biết rằng một trình biên dịch cụ thể cho phép cú pháp đã cho. Nó không cho bạn biết gì về ngữ nghĩa hay tính chính xác của tuyên bố liên quan đến tiêu chuẩn ngôn ngữ. – Trent

+0

Tôi cho rằng tôi có thể làm rõ câu hỏi. Như Trent vui lòng chỉ ra, nó không phải là quá nhiều nếu điều này sẽ biên dịch. Tôi tò mò về những gì đang diễn ra đằng sau hậu trường và gặp khó khăn trong việc tìm kiếm thông tin tốt trên mạng! – Chris

Trả lời

17

Bất cứ khi nào trình biên dịch có thể suy ra các đối số mẫu từ các đối số hàm, bạn có thể bỏ chúng ra ngoài. Đây cũng là thực hành tốt, vì nó sẽ làm cho mã của bạn dễ đọc hơn.

Ngoài ra, bạn chỉ có thể để lại lập luận mẫu của cuối cùng, không phải là đầu hoặc giữa:

template<typename T, typename U> void f(T t) {} 
template<typename T, typename U> void g(U u) {} 

int main() { 
    f<int>(5);  // NOT LEGAL 
    f<int, int>(5); // LEGAL 

    g<int>(5);  // LEGAL 
    g<int, int>(5); // LEGAL 

    return 0; 
} 
10

Không có gì sai khi gọi nó với thông số mẫu ẩn. Trình biên dịch sẽ cho bạn biết nếu nó bị nhầm lẫn, trong trường hợp đó bạn có thể phải xác định rõ ràng các tham số mẫu để gọi hàm.

+1

Câu trả lời này thậm chí không có ý nghĩa. Bạn luôn gọi hàm một cách rõ ràng ... – Zifre

+1

Zifre, tôi nghĩ anh ấy có nghĩa là "trong trường hợp đó bạn có thể phải bao gồm rõ ràng các tham số mẫu trong lời gọi hàm". – aem

+1

Tôi không nói về chức năng gọi một cách rõ ràng hoặc ngầm tôi nói về việc xác định rõ ràng các tham số mẫu ... – DeusAduro

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