我目前正在使用主要是boost的代码,但越来越多地将其移至C ++ 11及其std库。
我在传递空的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的测试。
如何避免此问题?是否可以解决此问题,以便将分配给std :: function的空boost :: function给出空的std :: function?还是我可以明确检查std :: function是否为其分配了空的boost :: function?
仅避免避免异常不是预期的解决方案,因为该函数的行为应取决于是否设置了回调(或未设置)(并且通常未设置,因此也应避免捕获异常)。
答案 0 :(得分:1)
如何?
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();
}