Преобразование boost:: function в std:: function
Я обновляю часть нашего старого кода, чтобы использовать возможности С++ 11 вместо эквивалентов boost. Однако не все это простая замена пространства имен, как неупорядоченные контейнеры и интеллектуальные указатели.
Например, boost::function
имеет методы empty()
и clear()
, но std::function
не работает.
Существует operator()
, определенный для std::function
, который я использовал для замены ссылок empty()
, но что я должен использовать для замены ссылок clear()
?
Я рассмотрел использование оператора присваивания std::function
и присвоение nullptr
, чтобы очистить его, но я беспокоюсь, что может иметь непреднамеренные побочные эффекты при очистке не только базовой функции, но и при условии, что объект не может использоваться.
Очевидно, что лучшим решением будет инициализация по умолчанию любых объектов-членов многократно используемых объектов, так что всегда есть действительный обратный вызов, который может быть просто обновлен с предоставленным пользователем, но я просто нацелен на прямую замену предыдущего использования сейчас не обзор кода.
Ответы
Ответ 1
Существует operator()
, определенный для std::function
, который я использовал для замены empty()
Вы имеете в виду operator!
?
Для empty
используйте этот оператор для проверки его в булевом контексте:
if (f.empty())
становится:
if (!f)
Или
if (!f.empty())
становится:
if (f)
(Это также работает с boost::function
, который также имеет operator!
и operator bool
.)
Для clear
присвойте ему nullptr
, который не делает его непригодным для использования, он просто устанавливает его в состояние по умолчанию:
f.clear();
становится
f = nullptr;
Это эквивалентно:
f = decltype(f){};
но легче печатать и читать легче!