2011-12-29 33 views
5

thể trùng lặp:
C++ templates that accept only certain typesChúng ta có thể định nghĩa một hàm mẫu cho một số kiểu dữ liệu không?

Ví dụ, nếu chúng ta muốn xác định một mẫu chức năng mà chúng ta có thể sử dụng số nguyên, phao, đôi nhưng không dây. Có cách nào dễ dàng để làm như vậy không?

+0

Theo như tôi biết, không phải trong C++ ngay cả C++ 11, nhưng các tính năng cũ đã bị loại bỏ liên quan đến khái niệm làm những gì bạn muốn nếu tôi nhớ rõ. – Geoffroy

+0

@Geoffroy: không có hỗ trợ cấp độ ngôn ngữ cốt lõi cho điều này nhưng bằng cách sử dụng enable_if nó có thể được thực hiện (xem câu trả lời của tôi). Nó có thể hơi cồng kềnh nhưng tôi có thể tưởng tượng một số loại trình trợ giúp có thể cung cấp cú pháp đẹp hơn này trong C++ 2011 bằng cách sử dụng các mẫu variadic (tôi chưa thử nghiệm điều này, tuy nhiên). –

+0

Bạn có muốn định nghĩa tương tự để áp dụng cho các loại được hỗ trợ hay bạn cần xác định nó khác nhau cho từng loại? nghĩa là 'f ' có cùng nội dung giống với 'f '? –

Trả lời

8

Cách thực hiện việc này để sử dụng std::enable_if ở một số hình dạng hoặc biểu mẫu. Bộ chọn cho loại được hỗ trợ sau đó được sử dụng làm kiểu trả về. Ví dụ:

template <typename T> struct is_supported { enum { value = false }; }; 
    template <> struct is_supported<int> { enum { value = true }; }; 
    template <> struct is_supported<float> { enum { value = true }; }; 
    template <> struct is_supported<double> { enum { value = true }; }; 

    template <typename T> 
    typename std::enable_if<is_supported<T>::value, T>::type 
    restricted_template(T const& value) { 
    return value; 
    } 

Rõ ràng, bạn muốn cung cấp cho các đặc điểm có tên tốt hơn is_supported. std::enable_if là một phần của C++ 2011 nhưng có thể dễ dàng triển khai hoặc thu được từ boost trong trường hợp không có sẵn với thư viện chuẩn mà bạn đang sử dụng.

Nói chung, thường không cần thiết để áp đặt các hạn chế rõ ràng vì việc triển khai mẫu thường có các hạn chế tiềm ẩn. Tuy nhiên, đôi khi rất hữu ích khi vô hiệu hóa hoặc bật một số loại nhất định.

0

Bạn có thể kiểm tra các loại giá trị. Nếu họ là một trong những loại được chỉ định của bạn, bạn có thể tiếp tục, nếu không bạn có thể trả lại chức năng. Xem tại đây để biết thêm thông tin: http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fthe_typeid_operator.htm

Với việc sử dụng typeid, bạn cũng có thể ném biên dịch.

0

Thông thường các danh sách trắng nhất định hạn chế việc sử dụng mẫu rất nhiều.

Tăng cường được gọi là concepts về cơ bản là giao diện cho mẫu. thay vì danh sách trắng nhất định, bạn có thể tạo lỗi thời gian biên dịch nếu các điều kiện nhất định (chức năng bị thiếu hoặc có đối số sai, v.v.) không được đáp ứng. tất nhiên bạn cũng có thể sử dụng điều này để hạn chế đối số mẫu của bạn cho một số loại nhất định.

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