如何识别或避免空的boost :: function为std :: function

时间:2019-01-24 10:48:58

标签: c++11 boost

我目前正在使用主要是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?

仅避免避免异常不是预期的解决方案,因为该函数的行为应取决于是否设置了回调(或未设置)(并且通常未设置,因此也应避免捕获异常)。

1 个答案:

答案 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();
    }