Можно ли использовать const_cast в этом случае?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Можно ли использовать const_cast в этом случае?

Сообщение Anonymous »

Я слышал бесчисленное количество раз, что const_cast почти всегда является кодовым запахом, поэтому мне интересно, нашел ли я использование для него, которое является приемлемым.

Код: Выделить всё

struct event_timer {
uint64_t id;
time_point deadline;
bool recurring;
std::move_only_function callback;

constexpr bool operator
Чтобы обработать повторяющиеся таймеры, мне нужно было бы подтолкнуть обратный вызов таймера с истекшим сроком действия к очереди задачи, но затем также подтолкнуть новый обновленный таймер в очередь таймера. Это потребует возможности копировать обратный вызов, чтобы он мог быть в двух местах одновременно. Вместо этого я перемещаю обратный вызов в новый таймер, и я толкаю ламбу на очередь задач, которая отражает идентификатор таймера. Когда этот лямбда выполняется, она просматривает итератор в соответствующий таймер из std :: unomoromed_map  
и если он все еще существует, это постоянное Идентификаторы итераторов для реализации быстрой отмены от Id.)

Код: Выделить всё

tasks.emplace([this, id = timer.id] {
if (auto it = timerIterators.find(id); it != timerIterators.end()) {
const_cast(it->second->callback)();
}
});
Const_cast здесь необходимо, потому что std :: set только возвращает итераторы Const, потому что любая модификация одного из его элементов может Invanity его инвариант при упорядочении элемента. Тем не менее, упорядочение event_timer основано только на крайнем сроке и идентификаторе, ни один из которых не будет изменен, позвонив в обратный вызов таймера.

Подробнее здесь: https://stackoverflow.com/questions/796 ... rcumstance
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»