C++11 如何将空boost::function识别或避免为std::function
我目前正在编写一个主要使用boost的代码,但越来越多地使用C++11和它的std库 在那里,我将空的boost::函数作为回调传递给std::函数时发生崩溃: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 &
#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();
}