2011-08-04 30 views
5

Có thể bằng cách nào đó cấm sử dụng chức năng templated cho các loại mà chuyên môn không được viết rõ ràng. Ý tôi là một cái gì đó như thếkhối không chuyên mẫu C++

template <typename T> 
void foo(){} 

template <> 
void foo<int>(){} 

int main(int argc, char* argv[]){ 
    foo<int>(); //ok 
    foo<char>(); //Wrong - no specialized version for char. 
} 

Tôi không thể bỏ qua phiên bản chung của hàm, do đó trình biên dịch cho biết, foo không phải là chức năng mẫu khi tôi cố gắng chuyên. Tôi chỉ đơn giản có thể viết một cái gì đó mà không biên dịch trong chức năng chung chung, và thêm một số bình luận giải thích lý do tại sao, nhưng điều này sẽ khá không thông tin. Những gì tôi muốn làm, là để có thể trực tiếp gây ra trình biên dịch để đi với lỗi như "foo() không được xác định".

Trả lời

13

Chắc chắn: chỉ không xác định nó và bạn sẽ nhận được một lỗi mối liên kết nếu bạn cố gắng sử dụng nó:

template <typename T> 
void foo(); // not defined 

template <> 
void foo<int>() { } 

Ngoài ra, bạn có thể sử dụng một số biến thể của một khẳng định tĩnh để đưa ra một "đẹp hơn "lỗi thời gian biên dịch. Dưới đây là một ví dụ sử dụng C++ 0x static_assert. Lưu ý rằng bạn phải đặt giá trị false phụ thuộc vào thông số mẫu, nếu không, static_assert có thể được kích hoạt khi mẫu được phân tích cú pháp.

template <typename T> 
struct dependent_false { enum { value = false }; }; 

template <typename T> 
void foo() 
{ 
    static_assert(dependent_false<T>::value, "Oops, you used the primary template"); 
} 

Lưu ý rằng thường là tốt nhất not to specialize function templates. Thay vào đó, tốt hơn là ủy quyền cho một mẫu lớp học chuyên biệt:

template <typename T> 
struct foo_impl 
{ 
    static_assert(dependent_false<T>::value, "Oops, you used the primary template"); 
}; 

template<> 
struct foo_impl<int> 
{ 
    static void foo() { } 
}; 

template <typename T> 
void foo() 
{ 
    return foo_impl<T>::foo(); 
} 
4

Chắc chắn, không cung cấp định nghĩa cho mẫu chung mặc định.

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