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

发布时间:2024年01月17日

任何定义了函数调用操作符的对象都是函数对象。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

文章来源:https://blog.csdn.net/qq_40788199/article/details/135582644
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。