Как распознать или избежать пустой boost :: function как std :: function - PullRequest
0 голосов
/ 24 января 2019

В настоящее время я работаю над кодом, использующим в основном boost, но все больше и больше перехожу на C ++ 11 и его стандартную библиотеку.

Там у меня произошел сбой при передаче пустого boost :: function в качестве обратного вызова в std :: function:

#include <boost/function.hpp>
#include <functional>
#include <iostream>

int main()
{
   boost::function <void(void)> boost_f;
   std::function <void(void)> std_f;
   std::cout << "used " << (std_f!=nullptr) << " " << (!boost_f.empty()) << "\n";

   boost_f = boost::function<void(void)>();
   std_f = boost_f;
   std::cout << "used " << (std_f!=nullptr) << " " << (!boost_f.empty()) << "\n";

   if( std_f )
      std_f();
}

std :: function утверждает, что у нее есть действительная цель, но пустая boost :: function выдает исключение:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_function_call> >'
  what():  call to empty boost::function

Протестировано с gcc-6.3.1 и clang-4.0.

Как я мог избежать этой проблемы? Можно ли это исправить, чтобы пустая функция boost :: function, назначенная std :: function, давала пустую std :: function? Или я мог бы явно проверить std :: function на наличие назначенной ему пустой boost :: function?

Только исключение исключения не является предполагаемым решением, поскольку функция должна вести себя по-разному, в зависимости от того, установлен или нет обратный вызов (и он часто не устанавливается, поэтому также следует избегать перехвата исключения).

1 Ответ

0 голосов
/ 26 января 2019

Как насчет этого:

    if(std_f)
    {
        if( std_f.target_type()==typeid(boost::function<void(void)>))
        {
            auto boostF=std_f.target<boost::function<void(void)>>();
            if(boostF&&*boostF)
                std_f();
            else
            {
                std::cout<<"empty boost function"<<std::endl;
            }
        }
        else
            std_f();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...