Можем ли мы использовать std::function и std::ref для замены boost::function и boost::ref соответственно?
В настоящее время я удаляю зависимости Boost из проекта. Я заменил иboost::ref
с иstd::ref
, соответственно. Я смог построить проект, но в случае его выполнения поймал исключение и заморозил функциональность.
Далее, после заменыboost::function
сstd::function
, нельзя сравниватьstd::function<void()>
непосредственно с помощью метода статической пустоты.
У кого-нибудь есть предложения по этому поводу?
bool NotificationQueue::evoke(boost::function<void()> runner) {
if (runner == &Sentinel::stop) {
return false;
}
}
это работало с boost perfect, и когда я заменил boost на std, эти изменения были сделаны
bool NotificationQueue::evoke(function<void()> runner) {
if (runner.target<void()>() == &Sentinel::stop) {
return false;
}
Также следующая ошибка получает броски
static void stop() { throw std::logic_error("stop sentinel should not be executed"); }
где я включил этот метод остановки в следующий код
_stopFn(&Sentinel::stop)
void NotificationQueue::postStop() {
постуведомление (ссылка (_stopFn));
unique_lock<mutex> lock(_mutex);
if (!_notificationEnabled) {
_stopped = true;
_enabledNotifier.notify_all();
}
}
указанная выше ссылка ранее находилась в boost::ref
1 ответ
Спасибо за фрагменты. Они помогают точно определить функцию, которую вы пропустили.
Документы на https://en.cppreference.com/w/cpp/utility/functional/function/target включают пример того, как использоватьtarget<>
чтобы получить желаемое поведение.
Давайте реализуемis_equal
для обоих и :
template <typename Sig>
static bool is_equal(boost::function<Sig> const& lhs, Sig* rhs) {
return lhs == rhs;
}
template <typename Sig>
static bool is_equal(std::function<Sig> const& lhs, Sig* rhs) {
return lhs && lhs.target_type() == typeid(Sig*) && *lhs.template target<Sig*>() == rhs;
}
Теперь вы можете выполнять одни и те же тесты с обоимиboost::function
иstd::function
:
using SIG = void(int);
void foo(int) { std::puts("foo"); }
void bar(int) { std::puts("bar"); }
template <template <typename> class Function> void tests() {
Function<SIG> f;
assert(!is_equal(f, &foo));
assert(!is_equal(f, &bar));
f = foo;
assert(is_equal(f, &foo));
assert(!is_equal(f, &bar));
f = bar;
assert(!is_equal(f, &foo));
assert(is_equal(f, &bar));
}
int main()
{
tests<boost::function>();
tests<std::function>();
}
Смотрите в прямом эфире на Колиру
Вы можете немного обобщить, чтобы он не предполагал статические функции с точно такой же сигнатурой: /questions/27144526/szhatie-raspakovka-papok-i-fajlov/27144534#27144534