任何定义了函数调用操作符的对象都是函数对象。C++ 支持创建、操作新的函数对象,同时也提供了许多内置的函数对象。
std::function 提供存储任意类型函数对象的支持。
std::function
template< class > | (C++11 起) | |
template< class R, class... Args > | (C++11 起) |
类模板 std::function
是通用多态函数封装器。 std::function
的实例能存储、复制及调用任何可调用 (Callable) 目标——函数、 lambda 表达式、 bind 表达式或其他函数对象,还有指向成员函数指针和指向数据成员指针。
存储的可调用对象被称为 std::function
的目标。若 std::function
不含目标,则称它为空。调用空 std::function
的目标导致抛出 std::bad_function_call 异常。
std::function
满足可复制构造 (CopyConstructible) 和可复制赋值 (CopyAssignable) 。
类型 | 定义 |
result_type | R |
argument_type (C++17 中弃用)(C++20 中移除) | 若 sizeof...(Args)==1 且 T 是 Args... 中首个且唯一的类型,则为 T |
first_argument_type (C++17 中弃用)(C++20 中移除) | 若 sizeof...(Args)==2 且 T1 是 Args... 中二个类型的第一个,则为 T1 |
second_argument_type (C++17 中弃用)(C++20 中移除) | 若 sizeof...(Args)==2 且 T2 是 Args... 中二个类型的第二个,则为 T2 |
std::function<R(Args...)>::swap
void swap( function& other ) noexcept; | (C++11 起) |
交换 *this 与 other
存储的可调用对象。
other | - | 要与之互换存储可调用对象的函数包装器 |
(无)
std::swap(std::function)
template< class R, class... Args > | (C++11 起) (C++17 前) | |
template< class R, class... Args > | (C++17 起) |
为 std::function 特化 std::swap 算法。交换 lhs
与 rhs
的状态。等效地调用 lhs.swap(rhs) 。
lhs, rhs | - | 要交换状态的多态函数封装器 |
(无)
#include <iostream>
#include <functional>
int main()
{
std::cout << std::boolalpha;
std::function<bool(int)> function1 = [](int num)
{
return num % 2 == 0;
};
std::function<bool(int)> function2 = [](int num)
{
return num % 2 == 1;
};
std::cout << typeid(function1).name() << " function1(1024): " << function1(1024) << std::endl;
std::cout << typeid(function1).name() << " function1 bool : " << (function1 ? true : false) << std::endl;
std::cout << typeid(function2).name() << " function2(1024): " << function2(1024) << std::endl;
std::cout << typeid(function2).name() << " function2 bool : " << (function2 ? true : false) << std::endl;
std::cout << "after swap one" << std::endl;
//交换 *this 与 other 存储的可调用对象。
function1.swap(function2);
std::cout << typeid(function1).name() << " function1(1024): " << function1(1024) << std::endl;
std::cout << typeid(function1).name() << " function1 bool : " << (function1 ? true : false) << std::endl;
std::cout << typeid(function2).name() << " function2(1024): " << function2(1024) << std::endl;
std::cout << typeid(function2).name() << " function2 bool : " << (function2 ? true : false) << std::endl;
std::cout << "after swap two" << std::endl;
//为 std::function 特化 std::swap 算法。交换 lhs 与 rhs 的状态。等效地调用 lhs.swap(rhs) 。
std::swap(function1, function2);
std::cout << typeid(function1).name() << " function1(1024): " << function1(1024) << std::endl;
std::cout << typeid(function1).name() << " function1 bool : " << (function1 ? true : false) << std::endl;
std::cout << typeid(function2).name() << " function2(1024): " << function2(1024) << std::endl;
std::cout << typeid(function2).name() << " function2 bool : " << (function2 ? true : false) << std::endl;
return 0;
}
St8functionIFbiEE function1(1024): true
St8functionIFbiEE function1 bool : true
St8functionIFbiEE function2(1024): false
St8functionIFbiEE function2 bool : true
after swap one
St8functionIFbiEE function1(1024): false
St8functionIFbiEE function1 bool : true
St8functionIFbiEE function2(1024): true
St8functionIFbiEE function2 bool : true
after swap two
St8functionIFbiEE function1(1024): true
St8functionIFbiEE function1 bool : true
St8functionIFbiEE function2(1024): false
St8functionIFbiEE function2 bool : true