Можем ли мы использовать 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

Другие вопросы по тегам