Tôi nghĩ về quá tải std::is_pointer
trong C++ 11 để có được giá trị đúng cho std::shared_ptr<T>
, vì sau này hoạt động rất nhiều như là T*
.C++ 11: mở rộng std :: is_pointer thành std :: shared_ptr
#include <type_traits>
namespace std {
template <typename T> struct is_pointer<shared_ptr<T>> : std::true_type {};
template <typename T> struct is_pointer<shared_ptr<T const>> : std::true_type {};
}
Tôi tự hỏi tại sao quá tải này chưa được đưa vào triển khai chuẩn. Có một cạm bẫy mà tôi nhìn?
Là một thay thế, tất nhiên có thể giới thiệu một đặc điểm mới is_shared_ptr<T>
.
Thực ra, tôi đã thử đoạn code sau ở nơi đầu tiên:
template <typename T>
struct is_pointer<shared_ptr<typename std::remove_cv<T>::type>>
: std::true_type
{};
mà không biên dịch với GCC 4.7 do
error: template parameters not used in partial specialization:
error: ‘T’
'is_pointer' là hữu ích trong lập trình mẫu khi tôi muốn biết nếu một cái gì đó là một loại con trỏ thô, không giống như một con trỏ. Bạn có thể thực hiện một 'is_like_ptr' làm những việc như kiểm tra với SFINAE nếu' * p' và '++ p' là các biểu thức hợp lệ. – aschepler
@aschepler: Con trỏ thông minh thường không hỗ trợ số học. 'is_dereferencable', chỉ cần kiểm tra' * p', có thể phù hợp hơn. –
Điểm tốt. Tôi không nghĩ rằng tôi đang tỉnh táo. – aschepler