Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 如何将空boost::function识别或避免为std::function_C++11_Boost - Fatal编程技术网

C++11 如何将空boost::function识别或避免为std::function

C++11 如何将空boost::function识别或避免为std::function,c++11,boost,C++11,Boost,我目前正在编写一个主要使用boost的代码,但越来越多地使用C++11和它的std库 在那里,我将空的boost::函数作为回调传递给std::函数时发生崩溃: #include <boost/function.hpp> #include <functional> #include <iostream> int main() { boost::function <void(void)> boost_f; std::function &

我目前正在编写一个主要使用boost的代码,但越来越多地使用C++11和它的std库

在那里,我将空的boost::函数作为回调传递给std::函数时发生崩溃:

#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();
}
#包括
#包括
#包括
int main()
{
boost::函数boost\u f;
std::函数std_f;
std::cout这个怎么样:

    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();
    }
if(标准)
{
if(std_f.target_type()==typeid(boost::function))
{
自动boostF=std_f.target();
if(boostF&&*boostF)
std_f();
其他的
{

std::我认为您不能在赋值或初始化时进行检查,因为没有钩子或自定义点来改变
std::function
boost::function
在这方面的默认行为。助手函数
boostFctOrEmpty(boost::function&)怎么样
,但是?如果函数对象是非空的,则返回函数对象,否则返回空的
std::function
对象。调用方需要这些辅助函数?在实际代码中,回调是通过函数设置的,我希望避免调整调用方。一个选项是使用std::function和boost:.function直到所有调用方都使用std::function…您可以使用try-catch对捕获异常并处理它。@eprom我也考虑过捕获,但这会创建太多过时的异常(请参阅我的问题)谢谢,这真的很有效,可以在存储回调的函数中高效地实现。不客气!顺便说一句,如果你不使用无法修改的第三方库,最好只使用std::function和boost::function中的一个。像你一样混合它们就相当于用两层包装一个可调用对象,因此它会这些问题我都不知道。
    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();
    }