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.
Nguồn
2011-12-29 18:14:48
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
@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). –
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 '? –