Câu chuyện bắt đầu bằng thứ tôi nghĩ khá đơn giản:Thùng chứa không thay đổi có nội dung có thể thay đổi
Tôi cần thiết kế một lớp sẽ sử dụng một số vùng chứa STL. Tôi cần cấp cho người dùng quyền truy cập lớp vào phiên bản không thể thay đổi của các vùng chứa đó. Tôi không muốn người dùng có thể thay đổi vùng chứa (chúng có thể không phải là push_back()
trên danh sách), nhưng tôi muốn người dùng có thể thay đổi các đối tượng chứa (lấy một phần tử với back()
và sửa đổi nó) :
class Foo
{
public:
// [...]
ImmutableListWithMutableElementsType getImmutableListWithMutableElements();
// [...]
};
// [...]
myList = foo.getImmutableListWithMutableElements();
myElement = myList.back();
myElement.change(42); // OK
// [...]
// myList.push_back(myOtherElement); // Not possible
Thoạt nhìn, có vẻ như một container const sẽ làm. Nhưng tất nhiên, bạn chỉ có thể sử dụng trình biến đổi const const trên một thùng chứa const và bạn không thể thay đổi nội dung.
Trong nháy mắt thứ hai, những thứ như container hoặc công cụ vòng lặp chuyên biệt sẽ đến với bạn. Tôi có lẽ sẽ kết thúc với điều đó.
Sau đó, suy nghĩ của tôi là "Ai đó đã làm điều đó rồi!" hoặc "Một giải pháp thanh lịch, chung chung phải tồn tại!" và tôi ở đây hỏi câu hỏi đầu tiên của tôi về SO:
Làm thế nào để bạn thiết kế/chuyển đổi một thùng chứa tiêu chuẩn thành một container không thay đổi với nội dung có thể thay đổi?
Tôi đang làm việc trên đó nhưng tôi có cảm giác như ai đó sẽ chỉ nói "Này, tôi mà mọi thời gian, thật dễ dàng, nhìn kìa!", Vì vậy tôi hỏi ...
Cảm ơn bạn cho bất kỳ gợi ý, gợi ý hoặc cách chung chung tuyệt vời để làm điều đó :)
EDIT:
Sau khi một số thí nghiệm, tôi đã kết thúc với container tiêu chuẩn có thể xử lý một số gợi ý thông minh được trang trí đặc biệt. Nó gần với câu trả lời của Nikolai.
Ý tưởng về một container không thay đổi của các yếu tố có thể thay đổi không phải là một khái niệm giết người, xem các ghi chú thú vị trong câu trả lời của Oli.
Ý tưởng về trình lặp cụ thể là đúng, nhưng có vẻ như không thực tế vì tôi cần phải thích ứng với bất kỳ loại vùng chứa nào.
Cảm ơn tất cả vì sự giúp đỡ của bạn.
Có, nhưng để có được một container bất biến, tôi phải trả lại một container const, và sau đó tôi sẽ nhận được các yếu tố const từ nó, không? Bạn đề nghị sử dụng const_cast? Tất nhiên nó là một khả năng, nhưng nó sẽ là một nỗi đau để sử dụng ... hoặc làm tôi bỏ lỡ một cái gì đó? – neuro
Các con trỏ trong thùng chứa 'const' sẽ là' const', nhưng không phải là các đối tượng mà chúng trỏ đến. –
vâng, bạn có quyền tất nhiên. Điều duy nhất là nó không phải là chung chung như tôi nghĩ rằng nó có thể được. Là một phần của khuôn khổ, tôi muốn cung cấp khả năng cho các nhà phát triển khuôn khổ sử dụng bất kỳ loại vùng chứa nào. Nhưng sử dụng container con trỏ hoặc container con trỏ thông minh nên làm công việc ... – neuro