Field
một mình không phải là một loại, nhưng mẫu có thể tạo một nhóm các loại, chẳng hạn như Field<int>
và Field<double>
. Tất cả các trường này không liên quan sao cho một trường nào đó có nguồn gốc từ cái kia hay cái kia. Vì vậy, bạn phải thiết lập một số mối quan hệ giữa tất cả các loại được tạo ra. Một cách là sử dụng một lớp cơ sở không phải mẫu chung:
class FieldBase { };
template <typename T>
class Field : public FieldBase {
private:
T value;
DataType<T> type;
};
class Row {
private:
std::map<unsigned long,FieldBase*> column;
};
Và xem xét sử dụng con trỏ thông minh thay vì con trỏ thô trong mã. Dù sao, bây giờ vấn đề là loại thông tin bị mất - cho dù bạn trỏ đến một số Field<double>
hoặc đến một số Field<int>
không còn được biết nữa và chỉ có thể được phát hiện bằng cách giữ một số loại cờ trong cơ sở được đặt bởi lớp dẫn xuất - hoặc bằng cách yêu cầu RTTI sử dụng
dynamic_cast<Field<int>*>(field) != 0
Nhưng điều đó thật xấu xí. Đặc biệt là vì những gì bạn muốn có một ngữ nghĩa giá trị. Tôi muốn bạn có thể sao chép hàng của bạn và nó sẽ sao chép tất cả các trường trong đó. Và bạn sẽ muốn có được một đôi khi một đôi được lưu trữ - mà không cần đầu tiên sử dụng RTTI để hack theo cách của bạn đến loại có nguồn gốc.
Một cách để thực hiện việc này là sử dụng một công đoàn bị phân biệt đối xử. Về cơ bản, đó là một liên minh cho một số loại tùy ý và ngoài ra một loại cờ, lưu trữ giá trị nào hiện được lưu trữ trong trường đó (ví dụ: double, int, ...). Ví dụ:
template <typename T>
class Field {
private:
T value;
DataType<T> type;
};
class Row {
private:
std::map<unsigned long,
boost::variant< Field<int>, Field<double> > >
column;
};
boost :: variant làm tất cả công việc cho bạn. Bạn có thể sử dụng truy cập để làm cho nó gọi một functor bằng cách sử dụng quyền quá tải.Hãy xem qua số manual
Nguồn
2009-02-20 10:58:24
Vậy câu hỏi là gì? –
bạn không phải chuyển mã của mình thành html. chỉ cần đặt nó như là, với 4 chars thụt đầu dòng. –
tới Dave: Câu hỏi của tôi là: Vì Trường được tạo khuôn mẫu, làm cách nào tôi có thể "cho biết" sơ đồ :: bản đồ mà các giá trị là "bất kỳ loại Trường nào"? để litb: Cảm ơn bạn đã đề xuất! :-) – jbatista