Tôi muốn một phần chuyên về mẫu hiện có mà tôi không thể thay đổi (std::tr1::hash
) cho một lớp cơ sở và tất cả các lớp có nguồn gốc. Lý do là tôi đang sử dụng mẫu khuôn mẫu tò mò định kỳ cho đa hình, và hàm băm được thực hiện trong lớp cơ sở CRTP. Nếu tôi chỉ muốn một phần chuyên cho một lớp cơ sở CRTP, sau đó thật dễ dàng, tôi chỉ có thể viết:Làm thế nào để một phần chuyên về một mẫu lớp cho tất cả các loại có nguồn gốc?
namespace std { namespace tr1 {
template <typename Derived>
struct hash<CRTPBase<Derived> >
{
size_t operator()(const CRTPBase<Derived> & base) const
{
return base.hash();
}
};
} }
Nhưng chuyên môn hóa này không phù hợp với các lớp thừa kế thực tế, chỉ CRTPBase<Derived>
. Điều tôi muốn là cách viết chuyên môn từng phần cho Derived
nếu và chỉ khi nó xuất phát từ CRTPBase<Derived>
. pseudo-code của tôi là
namespace std { namespace tr1 {
template <typename Derived>
struct hash<typename boost::enable_if<std::tr1::is_base_of<CRTPBase<Derived>, Derived>,
Derived>::type>
{
size_t operator()(const CRTPBase<Derived> & base) const
{
return base.hash();
}
};
} }
... nhưng điều đó không làm việc vì trình biên dịch không thể nói rằng enable_if<condition, Derived>::type
là Derived
. Nếu tôi có thể thay đổi std::tr1::hash
, tôi chỉ cần thêm một thông số mẫu giả khác để sử dụng boost::enable_if
, theo khuyến cáo của tài liệu enable_if
, nhưng đó rõ ràng không phải là giải pháp tốt. Có cách nào xung quanh vấn đề này? Tôi có phải chỉ định mẫu băm tùy chỉnh trên mọi unordered_set
hoặc unordered_map
Tôi tạo hoặc hoàn toàn chuyên biệt hash
cho mọi lớp dẫn xuất không?
Có vẻ tốt, cảm ơn. – Doug