2010-04-28 39 views
10
template <class T> 
void max (T &a ,T &b) 
{}//generic template #1 

template<> void max(char &c, char &d) 
{} //template specializtion #2 

void max (char &c, char &d) 
{}//ordinary function  #3 

sự khác nhau giữa 1, 2 và 3 là gì?sự khác biệt giữa Chuyên môn rõ ràng về mẫu và chức năng thông thường là gì?

+1

Bạn không thể chuyên mẫu chức năng, hiệu ứng sẽ giống như quá tải thông thường. – AshleysBrain

+5

@AshleysBrain: Sai rồi. Bạn có thể chuyên các mẫu chức năng. Bạn chỉ không thể thực hiện các chuyên môn từng phần. – sbi

+0

Ooh, đó là ý tôi. Cảm ơn. – AshleysBrain

Trả lời

10
  1. là một hàm template
  2. là một tổng chuyên môn của hàm mẫu trước đó (không quá tải!)
  3. là một tình trạng quá tải của hàm

Dưới đây là một đoạn trích từ C++ Coding Standards: 101 Rules, Guidelines, and Best Practices :

66) Không chuyên mẫu chức năng

Chuyên môn mẫu chức năng không bao giờ tham gia vào quá tải: Vì vậy, mọi chuyên ngành bạn viết sẽ không ảnh hưởng đến mẫu nào được sử dụng và điều này sẽ chống lại những gì mọi người mong đợi bằng trực giác. Sau khi tất cả, nếu bạn đã viết một hàm nontemplate với chữ ký giống hệt thay vì một chuyên môn mẫu chức năng, hàm nontemplate sẽ luôn được chọn vì nó luôn được coi là phù hợp hơn so với mẫu.

Cuốn sách khuyên bạn thêm một mức gián tiếp bằng cách thực hiện các chức năng mẫu trong điều khoản của một lớp mẫu:

#include <algorithm> 

template<typename T> 
struct max_implementation 
{ 
    T& operator() (T& a, T& b) 
    { 
    return std::max(a, b); 
    } 
}; 

template<typename T> 
T& max(T& a, T& b) 
{ 
    return max_implementation<T>()(a, b); 
} 

Xem thêm:

+0

tôi chỉ sửa lỗi chính tả trong mã, xin lỗi vì điều đó –

+0

thêm liên kết gotw, giống như được cho bởi @Michael –

+0

thanx tôi đã hiểu điểm :) – Suri

2

Quy tắc đối sánh cho thông số mẫu khác với các hàm bị quá tải. Một ví dụ về những gì khác có thể được nhìn thấy khi bạn cố gắng để gọi max() với lập luận của tyoes khác nhau:

max(1,'2'); 

này sẽ phù hợp với chức năng quá tải, nhưng không phải mẫu cơ sở cũng không phải chuyên môn hóa.

+0

Trong đọc ban đầu của tôi về mã, tôi thấy không có sự khác biệt trong chữ ký giữa quá tải và chuyên môn, khác hơn mẫu. Tại sao, sau đó, sẽ 'max (1, '2')' không phù hợp với chuyên môn? Cụ thể hơn, tại sao '1',' int', được chuyển thành 'char' trong trường hợp quá tải nhưng không phải trong trường hợp chuyên môn hóa? – rcollyer

+0

@rcollyer: Xem Trích dẫn * # 66 * trong câu trả lời của Gregory. –

+0

@ rcollyer: Câu trả lời đơn giản là: _Vì tiêu chuẩn nói như vậy._ 'template <> void max (...)' là cú pháp cho một mẫu __specialization__; 'void max (...)' là cú pháp của hàm __overload__. Các quy tắc cho phù hợp với các hàm quá tải khác với các quy tắc cho phù hợp với các chuyên môn khuôn mẫu. (Và quá tải được chọn _first_ và chỉ khi một mẫu được chọn, có thể xem xét các chuyên ngành.) Tại sao việc chọn quá tải là thoải mái hơn nhiều so với việc chọn chuyên môn, tôi không thể nói. Nhưng tôi đoán rằng, sẽ quy tắc cho quá tải được tạo ra _now_, họ sẽ được chặt chẽ hơn, quá. – sbi

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