Tôi có một lớp trừu tượng cho các giá trị tương đương + hashable:C++ meta-lập trình: Một số mẫu mà * phải * kế thừa một lớp trừu tượng
class Key
{
public:
virtual bool operator ==(const Key&) const = 0;
virtual bool operator !=(const Key&) const = 0;
virtual u32 hashcode() const = 0;
};
và một số lớp C bê tông mà được thừa hưởng này.
class C : public Key
{
private:
u32 a, b;
public:
static const C& null; // a prototype for representing a "no value" C
// Some reasonable implementation; it's just a pair
// ...
};
và tôi muốn thực hiện một lớp HashSet templated:
template<class T inherits Key, const T& proto> class HashSet
{
//...
};
T là loại giá trị được lưu trữ trong các bộ. proto phải là một thể hiện của T được sử dụng như là giá trị "null" của loại T cho mục đích đưa vào thiết lập. Tôi có kinh nghiệm hợp lý với C++ nhưng không đặc biệt với TMP và, mặc dù nó có vẻ giống như một cái gì đó đáng xấu hổ đơn giản để kéo ra, tôi dường như không thể hiểu được điều gì đó giống như mã pseudo của tôi là "class T inherits Key" được thực hiện trong C++. Tôi muốn có thể tạo một tập hợp băm các phiên bản của C như:
HashSet<C, C::null> myset;
Ai đó có thể cho tôi biết cách xử lý hợp lý và thành ngữ trong C++ này là gì? Cảm ơn bạn!
['std :: enable_if'] (http://en.cppreference.com/w/cpp/types/enable_if) và [' std :: is_base_of'] (http://en.cppreference.com/ w/cpp/types/is_base_of). – Biffen
Tôi sẽ không bao giờ hiểu lý do tại sao 'std :: enable_if' bị ẩn trong danh sách tham số mẫu của mẫu chính được ưu tiên cho' static_assert' với thông điệp thân thiện với người dùng –
@PiotrSkotnicki Tôi cho rằng đó là sự cân bằng giữa một trình duyệt đẹp hơn thông báo lỗi và có các ràng buộc kiểu được ghi trực tiếp trong khai báo chứ không phải là ẩn trong định nghĩa. – TartanLlama