当前位置: 首页 > 知识库问答 >
问题:

使用std::f的优点[重复]

白子默
2023-03-14

亲爱的堆栈溢出用户。

我试图找到std::函数的优点,以及为什么我应该使用它而不是函子或函数指针。可悲的是,我没有找到一个令人满意的答案。

因此,如果您能告诉我< code>std::function的优点是什么,以及我应该在什么时候使用它,我将非常感激。希望我的问题也能帮助到别人。

共有2个答案

乐正峰
2023-03-14

std::函数的要点是使用某些给定的原型为通用可调用对象提供类型擦除。当您希望您的函数/类/任何东西接收具有特定签名的通用可调用对象(无论是函数指针,函子还是lambda)时,可以使用它,而不必使所有模板都超过此类可调用的类型。

此外,在某些情况下,即使制作所有模板也无济于事;想想有一个可以调用的异构“东西”向量,例如一个类似信号的对象。没有这种类型擦除,基本上是不可能的。

汪栋
2023-03-14

std::函数实现了一种称为类型擦除的技术,因为您可以在 std::function 中存储任何可调用的实体,无论是函子、成员函数还是免费函数 — 您甚至可以存储成员数据,这似乎有悖常理!

这里有一个例子,没有std::function(或类型擦除)就无法完成:

std::vector<std::function<void()>>  funs;
for(int i = 0; i < 10; ++i)
  funs.push_back([i] { std::cout << i < std::endl; });

for(auto const & f: funs)
   f();

下面是另一个存储成员数据的示例:

struct person
{ 
    std::string name;
};

int main()
{
    std::vector<person> people {
      {"Bjarne"},
      {"Alex"}
    };

    std::function<std::string(person const&)> name (&person::name);

    for(auto const & p : people)
       std::cout << name(p) << std::endl;
}

输出(演示):

Bjarne
Alex

希望有帮助。

 类似资料:
  • 问题内容: 我只是想知道什么是使用的优点和缺点,我们通常使用或但它会有所作为,如果我们使用?使用或任何其他打印语句是否有特定的缺点或优点? 谢谢。 编辑:是的,我确实知道printf和println之间的区别。 问题答案: Printf允许特殊格式: http://java.sun.com/developer/technicalArticles/Programming/sprintf/ 那是优势。

  • 问题内容: Socket.io允许您使用脉动信号“检查Socket.IO连接的运行状况”。心跳到底是什么?为什么我不应该使用它们? 问题答案: 心跳是一种小消息,它定期从客户端发送到服务器(或从服务器发送到客户端再返回到服务器),以确认客户端仍在活动中。 例如,如果您有一个为聊天室提供服务的Node.js应用程序,并且用户长时间没有说话,则无法判断他们是否仍然保持联系。通过以预定的时间间隔(例如,

  • 让我们先对std::make_unique和std::make_shared做个铺垫。std::make_shared是C++11标准的一部分,但很可惜的是,std::make_unique不是。它从C++14开始加入标准库。如果你在使用C++11,不用担心,一个基础版本的std::make_unique是很容易自己写出的,如下: template<typename T, typename...

  • 我已经执行了操作员的命令 头文件: cpp文件: 这对像这样的操作很有效 文件 ,但当用作 库特 结果有: 错误:无法将'std::ostream{aka std::basic_ostream}'左值绑定到'std::basic_ostream 编辑:替换为std::ostream

  • Item 21 优先使用std::make_unique和std::make_shared而不是直接使用new 我们先给std::make_unique以及std::make_shared提供一个公平的竞争环境,以此开始。std::make_shared是C++ 11标准的一部分,但是,遗憾的是,std::make_unique不是的。它刚成为C++ 14的一部分。如果你在使用C++11.不要怕,

  • 我在理解条件变量及其在互斥体中的使用时遇到了一些困难,我希望社区能帮助我。请注意,我来自win32背景,因此与CRITICAL_SECTION、HANDLE、SetEvent、WaitForMultipleObject等一起使用。 这是我第一次尝试使用C++11标准库进行并发操作,它是在这里找到的一个程序示例的修改版本。 关于这个的几个问题。 我读过“任何要等待std::condition_var