Không thể kết bạn với thông số mẫu vì tiêu chuẩn không cho phép nó. Làm thế nào tôi có thể có được hiệu quả điều tương tự sau đó?Kết bạn với thông số mẫu
Điều tôi muốn về cơ bản là một loại không thể sử dụng được bên ngoài đối tượng sở hữu nó. Tại sao thay vì quan điểm nhưng nếu bạn thực sự phải biết, tôi đang cố gắng xây dựng một bộ con trỏ thông minh trả lời vấn đề chia sẻ tài nguyên sở hữu. Vì vậy những gì tôi đang tìm cách để làm một cái gì đó giống như vậy, nếu nó làm việc:
template < typename T, typename Owner >
struct accessible_member
{
private:
accessible_member() : val(T()) {}
accessible_member(T const& t) : val(t) {}
operator T&() { return val; }
operator T const&() const { return val; }
member_ptr<T> operator &() { return member_ptr<T>(val); }
friend class Owner;
};
Vì vậy, một lớp không thể giữ đối tượng này như một thành viên trừ khi nó tuyên bố bản thân chủ sở hữu, và nếu nó đủ ngớ ngẩn để lộ nó như là, nó sẽ không thể sử dụng bên ngoài lớp học là ngu ngốc.
Tôi không thấy điểm cố gắng ngăn chặn mã braindead (như trong đoạn cuối). Trong C++, bạn chỉ cần chấp nhận rằng ai đó có thể phá vỡ mã của bạn nếu họ cố gắng hết sức. –
@Fred - đối số ngớ ngẩn đó có thể được sử dụng để chống lại bất kỳ và tất cả các nỗ lực để đưa ra các biện pháp an toàn mã, bao gồm 'const' và RAII. Bạn có thể làm việc theo một triết lý khác nhưng tôi viết theo hướng dẫn rằng cấu trúc của bạn nên dễ sử dụng đúng và khó sử dụng không chính xác. Toàn bộ vấn đề trong chính cấu trúc là giới thiệu các biện pháp an toàn không được cung cấp bởi bất kỳ thứ gì khác. Tôi thấy sự phản đối của bạn đối với câu hỏi của tôi dư thừa, không đúng chỗ và khá thẳng thắn. –
@NoahRoberts: 1) Điều này có vẻ không dễ sử dụng. 2) Const và RAII dễ sử dụng không chính xác. 3) Làm thế nào bạn có thể tìm thấy * của tôi * thiếu hiểu biết ("Tôi không thấy điểm") để được tấn công? Bạn có bị xúc phạm thay mặt tôi để bảo vệ bản thân tôi khỏi tôi không? –