Подтвердить что ты не робот

Преобразование boost:: function в std:: function

Я обновляю часть нашего старого кода, чтобы использовать возможности С++ 11 вместо эквивалентов boost. Однако не все это простая замена пространства имен, как неупорядоченные контейнеры и интеллектуальные указатели.

Например, boost::function имеет методы empty() и clear(), но std::function не работает.

Существует operator(), определенный для std::function, который я использовал для замены ссылок empty(), но что я должен использовать для замены ссылок clear()?

Я рассмотрел использование оператора присваивания std::function и присвоение nullptr, чтобы очистить его, но я беспокоюсь, что может иметь непреднамеренные побочные эффекты при очистке не только базовой функции, но и при условии, что объект не может использоваться.

Очевидно, что лучшим решением будет инициализация по умолчанию любых объектов-членов многократно используемых объектов, так что всегда есть действительный обратный вызов, который может быть просто обновлен с предоставленным пользователем, но я просто нацелен на прямую замену предыдущего использования сейчас не обзор кода.

4b9b3361

Ответ 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){};

но легче печатать и читать легче!