Я реализую свой собственный механизм signal
/slot (шаблон наблюдателя, стиль Qt), поэтому у меня может быть property
, который уведомляет... вещи... которые изменились.
Я думаю, что C++11 предоставляет все необходимое, чтобы сделать возможной очень краткую и многофункциональную реализацию. «Проблема», с которой я сталкиваюсь, заключается в том, что если я хочу «подключиться» к сигналу объекта const
, мне нужно, чтобы функция signal::connect
была константной, но изменить список обратных вызовов/наблюдателей. Есть два простых способа исправить это:
const_cast
списки внутриconnect
.- Составьте списки
mutable
.
Оба мне кажутся одинаковыми (и об этом уже спрашивали, например, в этот вопрос), и это прекрасно логически, но стилистически сомнительно. Отсюда вопрос. Есть ли способ обойти это или это действительно оправданное использование const_cast
/mutable
?
Некоторый предварительный код, который у меня есть сейчас:
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;
};
Примечание. Я не тестировал этот код; это просто отражение моего текущего состояния ума.
signal
должен выставлять методыconst
. Почему бы не позволить пользователюsignal
решить, хотят ли они, чтобы он был изменчивым (или нет)? - person Matthieu M.   schedule 28.08.2016