В настоящее время я работаю над кодом, использующим в основном 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?
Только исключение исключения не является предполагаемым решением, поскольку функция должна вести себя по-разному, в зависимости от того, установлен или нет обратный вызов (и он часто не устанавливается, поэтому также следует избегать перехвата исключения).