C++ 面试题 目录

C++ 中 function 类的用法?

推荐答案

在C++中,std::function 是一个通用的函数封装器,可以用来存储、复制和调用任何可调用对象(如函数、lambda表达式、函数对象等)。它的主要用途是提供一种灵活的方式来处理不同类型的可调用对象。

基本用法

-- -------------------- ---- -------
-------- ----------
-------- ------------

---- ------------------ ------------ -------- -
    --------- -- ------- -- ----------
-

--- ------ -
    -- -- ------------- ------
    ------------------------ -------------- ---- - -------------
    ------------ ---------

    -- -- ------------- -- ------ ---
    --------------------- ---------- - ---- -
        --------- -- ----- -- - ------ ---------- -- ----------
    --
    -------------

    ------ --
-

存储成员函数

-- -------------------- ---- -------
-------- ----------
-------- ------------

----- ------- -
-------
    ---- ------------------ ------------ -------- -
        --------- -- ------- -- ----------
    -
--

--- ------ -
    ------- ----
    -- -- ------------- ------
    ---------------------------- ----- -------------- ---------- - -----------------------
    --------------- ------ ---- ------ ------------

    ------ --
-

存储函数对象

-- -------------------- ---- -------
-------- ----------
-------- ------------

------ --------- -
    ---- ---------------- ------------ -------- ----- -
        --------- -- ------- -- ----------
    -
--

--- ------ -
    --------- --------
    -- -- ------------- ------
    ------------------------ -------------- ----------- - --------
    ------------------ ---- -----------

    ------ --
-

本题详细解读

std::function 的用途

std::function 是C++11引入的一个模板类,用于存储和调用任何可调用对象。它提供了一种统一的方式来处理不同类型的可调用对象,使得代码更加灵活和可扩展。

std::function 的模板参数

std::function 的模板参数是一个函数签名,表示它可以存储的函数的类型。例如,std::function<void(int)> 表示可以存储一个接受 int 类型参数并返回 void 的函数。

std::function 的常见用法

  1. 存储普通函数:可以直接将函数指针赋值给 std::function 对象。
  2. 存储成员函数:需要使用 std::bind 或者 &ClassName::MemberFunction 来绑定对象实例。
  3. 存储 lambda 表达式:可以直接将 lambda 表达式赋值给 std::function 对象。
  4. 存储函数对象:可以直接将函数对象赋值给 std::function 对象。

std::function 的优势

  • 类型安全std::function 提供了类型安全的函数封装,避免了使用裸指针或 void* 带来的风险。
  • 灵活性:可以存储和调用各种类型的可调用对象,使得代码更加通用和可复用。
  • 易于使用std::function 的接口简单直观,易于理解和使用。

std::function 的局限性

  • 性能开销:由于 std::function 需要在运行时进行类型擦除和动态分配,因此可能会带来一定的性能开销。
  • 不能存储所有类型的可调用对象:例如,std::function 不能直接存储带有默认参数的函数。

通过合理使用 std::function,可以大大提高C++代码的灵活性和可维护性。

纠错
反馈