C++函数对象-函数包装器-(std::function)(三)交换内容(std::function<R(Args...)>::swap)

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


函数包装器

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

包装具有指定函数调用签名的任意类型的可调用对象

std::function

template< class >
class function; /* 不定义 */

(C++11 起)

template< class R, class... Args >
class function<R(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_typeR
argument_type(C++17 中弃用)(C++20 中移除)若 sizeof...(Args)==1 且 TArgs... 中首个且唯一的类型,则为 T
first_argument_type(C++17 中弃用)(C++20 中移除)若 sizeof...(Args)==2 且 T1Args... 中二个类型的第一个,则为 T1
second_argument_type(C++17 中弃用)(C++20 中移除)若 sizeof...(Args)==2 且 T2Args... 中二个类型的第二个,则为 T2

交换内容

std::function<R(Args...)>::swap

void swap( function& other ) noexcept;

(C++11 起)

交换 *this 与 other 存储的可调用对象。

参数

other-要与之互换存储可调用对象的函数包装器

返回值

(无)

特化 std::swap 算法

std::swap(std::function)

template< class R, class... Args >
void swap( function<R(Args...)> &lhs, function<R(Args...)> &rhs );

(C++11 起)
(C++17 前)

template< class R, class... Args >
void swap( function<R(Args...)> &lhs, function<R(Args...)> &rhs ) noexcept;

(C++17 起)

为 std::function 特化 std::swap 算法。交换 lhsrhs 的状态。等效地调用 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

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值