任何定义了函数调用操作符的对象都是函数对象。C++ 支持创建、操作新的函数对象,同时也提供了许多内置的函数对象。
std::function 提供存储任意类型函数对象的支持。
std::bad_function_call
class bad_function_call; | (C++11 起) |
std::bad_function_call
是若函数包装器无目标,则 std::function::operator()
将抛出的异常类型。
(构造函数) | 构造 bad_function_call 对象 (公开成员函数) |
bad_function_call() noexcept; |
构造新的 std::bad_function_call
实例。
继承图
(无)
(析构函数) [虚] | 析构该异常对象 ( std::exception 的虚公开成员函数) |
what [虚] | 返回解释性字符串 ( std::exception 的虚公开成员函数) |
#include <iostream>
#include <functional>
int main()
{
std::cout << std::boolalpha;
std::function<int()> function1 = nullptr;
std::cout << function1.target_type().name() << std::endl;
std::cout << typeid(function1).name() << " function1 bool : "
<< (function1 ? true : false) << std::endl;
try
{
function1();
}
catch (const std::bad_function_call& e)
{
std::cout << e.what() << std::endl;
}
std::function<bool(int)> function2 = [](int num)
{
return num % 2 == 1;
};
std::cout << function2.target_type().name() << " function2(1024): "
<< function2(1024) << std::endl;
std::cout << typeid(function2).name() << " function2 bool : "
<< (function2 ? true : false) << std::endl;
std::cout << typeid(function2).name() << " target_type() : "
<< (function2.target_type() == typeid(bool(*)(int)) ? true : false) << std::endl;
std::cout << typeid(function2).name() << " function2.target<bool(*)(int)>() : "
<< function2.target<bool(*)(int)>() << std::endl;
return 0;
}
v
St8functionIFivEE function1 bool : false
bad_function_call
Z4mainEUliE_ function2(1024): false
St8functionIFbiEE function2 bool : true
St8functionIFbiEE target_type() : false
St8functionIFbiEE function2.target<bool(*)(int)>() : 0