Tôi đang triển khai cơ chế signal
/slot (quan sát mẫu, kiểu Qt) của riêng mình để tôi có thể có property
thông báo ... nội dung ... đã thay đổi.Các tín hiệu thực hiện (mẫu quan sát): có thể thay đổi hoặc const_cast cần thiết?
Tôi nghĩ C++ 11 cung cấp mọi thứ cần thiết để thực hiện triển khai rất tốt và có tính năng có thể. Các "vấn đề" tôi đang chạy vào là nếu tôi muốn "kết nối" với một tín hiệu của một đối tượng const
, tôi cần các chức năng signal::connect
được const, nhưng sửa đổi danh sách callbacks/quan sát viên. Có hai cách đơn giản để khắc phục điều này:
const_cast
danh sách bên trongconnect
.- Lập danh sách
mutable
.
Cả hai dường như với tôi như điều tương tự (và điều này đã được yêu cầu trước đó, ví dụ trong this question), và hoàn toàn tốt đẹp một cách logic, nhưng phong cách đáng ngờ. Do đó câu hỏi. Có cách nào xung quanh việc này hay đây là việc sử dụng thực sự hợp lý của const_cast
/mutable
?
Một số mã prelimenary như tôi có nó bây giờ:
template<typename... ArgTypes>
class signal
{
public:
template<typename Callable>
void connect(Callable&& callback) const
{
std::lock_guard<std::mutex> lock(slots_mutex);
slots.emplace_back(callback);
}
void emit(ArgTypes... arguments) const
{
std::lock_guard<std::mutex> lock(slots_mutex);
for(auto&& callback : slots)
{
callback(arguments...);
}
}
private:
// mutable here allows to connect to a const object's signals
mutable std::vector<std::function<void(ArgTypes...)>> slots;
std::mutex slots_mutex;
};
Lưu ý tôi đã không kiểm tra mã này; đây chỉ là sự phản ánh trạng thái hiện tại của tôi.
Mã không được kiểm tra ... tsk tsk ... –
@Arnav Tôi đang viết các bài kiểm tra ngay bây giờ, tôi chỉ cần thiết để khắc phục vấn đề thiết kế này: p. – rubenvb
Tôi sợ tôi không hiểu tại sao 'tín hiệu' chính nó nên phơi bày' const' phương pháp. Tại sao không cho phép người dùng 'tín hiệu' quyết định liệu họ muốn nó có thể thay đổi được (hay không)? –