Tôi có một lớp mẫu cơ sở như thế này:Giới hạn chức năng được tạo khuôn mẫu cho các loại cơ sở và có nguồn gốc?
template<typename T, std::size_t Size>
class VectorT
{
public:
typedef T data_type;
}
và một vài các lớp thừa kế chuyên:
template<typename T>
class Vector2d : public VectorT<T, 2U>
{ // some specialised functions }
template<typename T>
class Vector3d : public VectorT<T, 3U>
{ // some other specialised functions }
và những công việc tốt. Howerver, tôi có một vài chức năng tự do cho các nhà khai thác. Ví dụ:
template<typename T, size_t Size>
VectorT<T, Size> operator*(T lhs, const VectorT<T, Size>& rhs)
{
...
}
Thật không may những không làm việc cho các lớp thừa kế của tôi, bởi vì họ trả về một VectorT<T, Size>
thay vì một Vector2d<T>
.
Vì vậy, tôi cố gắng với
template<V>
V operator*(typename V::data_type lhs, const V& rhs)
{
...
}
và điều này hoạt động tốt, tuy nhiên nó có thể dẫn đến sự mơ hồ bởi vì nó sucks trong bất cứ điều gì khác với một thành viên data_type.
Làm cách nào để khắc phục vấn đề này: làm cách nào để viết các chức năng an toàn loại chỉ hoạt động với cơ sở vectơ của tôi hoặc bất kỳ dẫn xuất nào?
Tôi đang cố gắng khám phá và xác định lại các toán tử một lần nữa cho các lớp con.
Cảm ơn bạn, đây là lần thứ hai tối nay bạn đã cho tôi câu trả lời liên quan đến SFINAE; Tôi nghĩ đây là nơi mà những khoảng trống trong kiến thức của tôi nói dối! Tôi không chắc chắn chính xác cách enable_if hoạt động, nhưng điều này đã làm việc thực sự tốt. Cám ơn bạn một lần nữa. – DanDan
@Kballo: liên quan đến việc thay thế 'boost ::' bằng 'std ::' -> lưu ý rằng 'std :: enable_if' tương đương với' boost :: enable_if_c', do đó bạn sẽ phải "unwrap" thành viên value' của 'is_base_of' khi chuyển sang' std :: '. –