C++函数对象-函数包装器-调用空的 std::function 时抛出的异常(std::bad_function_call)

任何定义了函数调用操作符的对象都是函数对象。C++ 支持创建、操作新的函数对象,同时也提供了许多内置的函数对象。


函数包装器

std::function 提供存储任意类型函数对象的支持。

用空的 std::function 时抛出的异常

std::bad_function_call

class bad_function_call;

(C++11 起)

std::bad_function_call 是若函数包装器无目标,则 std::function::operator() 将抛出的异常类型。

成员函数

(构造函数)

构造 bad_function_call 对象
(公开成员函数)

std::bad_function_call::bad_function_call()

bad_function_call() noexcept;

构造新的 std::bad_function_call 实例。

继承图

参数

(无)

继承自 std::exception

成员函数

(析构函数)

[虚]

析构该异常对象
(std::exception 的虚公开成员函数)

what

[虚]

返回解释性字符串
(std::exception 的虚公开成员函数)

调用示例

#include 
#include 

int main()
{
    std::cout << std::boolalpha;

    std::function 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 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() : "
              << function2.target() << 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() : 0

你可能感兴趣的:(#,函数包装器,c++,标准库模板,STL,函数对象,函数包装器,bad_,function_call)