问题标签 [std-function]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
6530 浏览

c++ - std::function 的模板参数(签名)不是其类型的一部分吗?

给定以下代码,歧义背后的原因是什么?我可以绕过它还是必须保留(烦人的)显式演员表?

有趣的是,如果我用参数注释掉a()函数并在我的 main 中调用,编译会因为类型不匹配和唯一可用函数的参数而正确失败。如果编译器在这种情况下失败,为什么存在两个函数时会有任何歧义?function<int ()>a(x)xfunction<int (int)>a()a()

我已经尝试过使用 VS2010 和 g++ v. 4.5。两者都给了我完全相同的歧义。

0 投票
4 回答
113028 浏览

c++ - std::function 和 std::bind: 它们是什么,应该在什么时候使用它们?

我知道函子是什么以及何时将它们与std算法一起使用,但我不明白 Stroustrup 在C++11 FAQ中对它们的看法。

任何人都可以解释什么std::bindstd::function是什么,什么时候应该使用它们,并为新手举一些例子?

0 投票
4 回答
4450 浏览

c++ - 带有函数类型参数的 C++ 模板的语法

我习惯于看到这样的函数指针语法

在一些 C++03 函数库中,我看到以这种方式使用的类型:

在 C++11 中,std::function我看到了以这种方式给出的类型

有一个缺失(*)。为什么?

C++03与相应的函数指针具有相同的类型function<T>T很容易想象实现。

std::functionC++11 中的核心语言增强支持。是否扩展了模板参数类型以适应可调用性?

0 投票
7 回答
14967 浏览

c++ - 为什么 std::function 实例有默认构造函数?

这可能是一个哲学问题,但我遇到了以下问题:

如果你定义了一个 std::function,但你没有正确初始化它,你的应用程序将会崩溃,像这样:

如果函数作为参数传递,如下所示:

然后,当然,它也会崩溃。这意味着我被迫添加这样的检查代码:

要求这些检查让我回想起过去的 C 时代,您还必须明确检查所有指针参数:

幸运的是,我们可以在 C++ 中使用引用,这使我无法编写这些检查(假设调用者没有将 nullptr 的内容传递给函数:

那么,为什么 std::function 实例有默认构造函数呢?如果没有默认构造函数,您就不必添加检查,就像函数的其他普通参数一样。在那些你想传递“可选”std::function 的“罕见”情况下,你仍然可以传递一个指向它的指针(或使用 boost::optional)。

0 投票
3 回答
1970 浏览

c++ - 绑定两个函数对象

建筑与clang++ -std=c++0x -stdlib=libc++ main.cpp

错误:

0 投票
1 回答
2362 浏览

c++ - 使用 shared_ptr 和 weak_ptr 来管理 std::function 的生命周期是否安全?

我创建了一个围绕 boost::asio::io_service 的包装器来处理 OpenGL 应用程序的 GUI 线程上的异步任务。

任务可能是从其他线程创建的,因此boost::asio似乎非常适合此目的,这意味着我不需要编写自己的任务队列以及关联的互斥锁和锁定。我想将每一帧的工作保持在可接受的阈值(例如 5 毫秒)以下,所以我一直在调用poll_one,直到超出所需的预算,而不是调用run. 据我所知,这需要我在reset发布新任务时打电话,这似乎运作良好。

由于它很短,这就是全部内容,无#include

我在我的主应用程序类中保留了一个 UiTaskQueueRef 实例,并mUiTaskQueue->update()从我的应用程序的动画循环中调用。

我想扩展此类的功能以允许取消任务。我之前的实现(使用几乎相同的接口)为每个任务返回一个数字 ID,并允许使用此 ID 取消任务。但是现在队列和相关锁定的管理由boost::asio我不知道如何最好地处理。

我已经尝试通过将我可能想要取消的任何任务包装在 a 中shared_ptr并制作一个包装器对象,该对象将 a 存储weak_ptr到任务并实现()运算符,以便可以将其传递给io_service. 它看起来像这样:

然后我的pushTask方法重载,如下所示:

然后我使用以下方法将可取消的任务发布到队列中:

或者VoidFunc如果您愿意,可以使用 typedef:

只要我保持shared_ptrtomTask左右,io_service就会执行任务。如果我打电话resetmTaskweak_ptr无法锁定,并且根据需要跳过任务。

我的问题实际上是对所有这些新工具的信心:是new std::function<void(void)>( std::bind( ... ) )一件可以做的事情,并且使用shared_ptr?

0 投票
1 回答
654 浏览

c++ - std::function:参数的严格编译时验证

我想实现一个类,它包含两个带有预定义函数签名的回调。

该类具有模板化 ctor,它使用 std::bind 创建 std::function 成员。如果将带有错误签名的函数传递给ctor,我预计编译器(g ++ 4.6)会抱怨。但是,编译器接受以下内容:

我能理解为什么会这样。我试图为 static_assert 构建适当的条件,但没有成功。

我怎样才能产生编译时错误来防止这种情况发生?

更新:访客的回答解决了我最初的问题。不幸的是,我有一堆相关的案例要解决,用以下代码(http://ideone.com/P32sU)演示:

在这种情况下,visitor 建议的 static_assert 在此处触发,尽管函数签名是有效的:

我认为最好只比较函数参数和返回值。请建议如何。

谢谢你。

0 投票
3 回答
1420 浏览

c++ - 从方法指针动态创建泛型函数指针,推导出返回值和参数

我有这个助手类,我用它来调用需要静态 C 函数的代码的成员方法。这个特定的“版本”与 Windows LPTHREADROUTINE 回调兼容,将DWORD (class::method) (void *)函数作为参数,调用如下:

我希望使整个事情变得通用,并且我知道它可以使用新的 C++11 标准来完成,但我无法完成它。

我尝试将 MakeThreadInfo 函数的接口更改为如下所示:

这似乎是要走的路,但我无法将这个值传递给上游。


这就是我想要得到的:

给定一个带有 MyMethod 方法的类 MyClass,以及一个变量返回类型的回调和一个或多个不同类型的参数(最后一个是 a void *userData),我怎样才能在尽可能少的样板化的情况下将一些东西传递给回调和让它依次调用 MyClass::MyMethod。

为了显示:

什么是有效的实现CreateGenericCPointer

0 投票
5 回答
49788 浏览

c++ - 我应该复制一个 std::function 还是总是可以参考它?

在我的 C++ 应用程序(使用 Visual Studio 2010)中,我需要存储一个 std::function,如下所示:

如您所见,我在构造函数中添加了函数参数作为引用。

但是,在我的班级中存储函数的最佳方式是什么?

  • 我可以将函数存储为引用,因为 std::function 只是一个函数指针,并且函数的“可执行代码”保证保留在内存中吗?
  • 如果传递了 lambda 并且调用者返回,我是否必须制作副本?

我的直觉说存储引用(甚至是常量引用)是安全的。我希望编译器在编译时为 lambda 生成代码,并在应用程序运行时将此可执行代码保存在“虚拟”内存中。因此可执行代码永远不会被“删除”,我可以安全地存储对它的引用。但这是真的吗?

0 投票
4 回答
23416 浏览

c++ - C++11 可变参数 std::function 参数

一个名为的函数test作为std::function<>其参数。

但是,如果我执行以下操作:

编译器(gcc 4.6.1)说no matching function for call to test(void (&)(int))

为了使最后一行test(foo)编译并正常工作,我该如何修改test()函数?在test()功能上,我需要f使用std::function<>.

我的意思是,是否有任何模板技巧可以让编译器确定函数的签名(foo例如),并将其std::function<void(int)>自动转换为?

编辑

我也想为 lambdas(有状态的和无状态的)做这项工作。