问题标签 [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 投票
5 回答
39887 浏览

c++ - 在 C++ 中使用“void”模板参数

采取以下最小示例:

如果是第二种类型的别名,我会收到错误“参数可能没有 'void' 类型”。(我使用 Xcode 4.5、Clang/c++11/libc++、OS X 10.7 进行了测试。)

我觉得这很奇怪:我本来期望Type1并且Type2<void>行为相同。这里发生了什么?有没有办法重写第二种类型的别名,以便我可以编写Type2<void>和获取std::function<void(void)>而不是错误?

编辑我可能应该补充一点,我想要这样做的原因是允许以下内容:

Continuation<decltype(someFunc())>变成Continuation<void>了,我得到了错误。

0 投票
2 回答
52097 浏览

c++ - lambda 的 Lambda :未捕获该函数

以下程序无法编译:

因为 :

这是什么意思以及如何解决问题?

0 投票
2 回答
7114 浏览

c++ - 为什么 std::function 不是有效的模板参数,而函数指针是?

我已经定义了名为的类模板CallBackAtInit,其唯一目的是在其初始化(构造函数)时调用一个函数。该函数在模板参数中指定。问题是模板不接受std::function作为参数;但他们接受函数指针。为什么?

这是我的代码:

0 投票
2 回答
4360 浏览

c++ - std::function 模板参数解析

我目前正在开发一个链接函数对象的库。

我正在创建一个函数模板,它接受一个可调用对象(目前是 std::function),并根据函数的输出和输入类型进行参数化。这是我定义的简化版本:

我遇到的问题是使用情况。似乎当我传递一个 lambda 时,编译器无法正确推断出类型,因此抱怨该函数不存在:

如果我将 lambda 显式包装在 中std::function,则程序将编译:

我还没有测试过传递函数指针或函数对象,但如果我不直接传递显式对象,编译器似乎很难推断出Inand参数。Outstd::function

我的问题是:有没有办法解决这个问题,这样我就可以推断出可调用对象的输入/返回类型,而无需在调用站点明确提及它们?

也许在函数类型而不是输入/返回类型上参数化模板?本质上,我需要推断任意可调用对象的Inand类型。模板函数的返回类型Out可能是某种auto/技巧?decltype

谢谢你。

0 投票
3 回答
160 浏览

c++ - 函数包装器初始化如何在 C++11 中工作?

如果我有这门课

我如何知道 keyPressHandler 是否已设置?我可以将其初始化为 NULL 然后对其进行测试吗?

0 投票
6 回答
7856 浏览

c++ - 并行使用 std::thread?

我是 std::thread 的新手,我尝试编写一个parallel_for. 我编码了以下内容:

但这不起作用:(来自 g++ 4.6 的错误代码)

如何解决这个问题呢 ?

编辑:这个新版本编译但没有给出好的结果:

结果是:

并行版本返回 4950,而顺序版本返回 155..... 问题出在哪里?

0 投票
2 回答
2114 浏览

c++ - 如何用 std::bind 做到这一点?

注意: 从标签中应该已经清楚了,这严格来说是 C++03。 是的,我知道,lambda 让所有这些痛苦消失了(并且带来了新的种类,我敢打赌),但这是一个嵌入式系统,使用 90 年代的操作系统版本,我被告知我应该很高兴我有一个 C++03 编译器(GCC4.1.x,BTW)或 C++ 编译器。所以请不要发布 C++11解决方案。真的不需要把它擦进去。当然
,当然std::bind()std::function()等等实际上是在 中std::tr1,但我编辑了 tr1前缀,因为我认为它主要只是给代码增加了噪音。

我有一些类似服务器的东西需要注册函数,我需要调整它们以调用某些对象的类似但略有不同的函数。这些函数有不同的参数列表。服务器“知道”,当我尝试注册一个函数时,它只接受一个具有正确签名的函数(std::function即,根据需要正确),这取决于作为模板参数传入的一些魔术标签。

这是代码的草图

这确实有效,但实际上有更多的功能,这样做是一种乏味的复制粘贴工作,侮辱了我的尊严感并产生了臭代码。由于所有这些函数的作用完全相同,唯一的区别是它们调用的函数以及它们有或没有要传递的参数,我应该能够将它们折叠成一个参数化函数,将差异隐藏在std::bind(). 如果做不到这一点,我决定首先对所有没有任何参数的函数(如foo())执行此操作,这是绝大多数。

所以我想通过一个完成繁琐部分的函数来路由所有foo()-like 函数的调用:XY::call_it

并将适当的函数X作为参数绑定到它:

显然,这是错误的,我解决此问题的所有其他尝试也是如此。(我现在才玩std::bind()了 10 周,所以请多多包涵)。最后,我迷失在一个令人难以置信的迷宫中,这些错误信息来自std::function模板化的胆量,这些信息会让一个成年人落泪,至少应该养活一个心理医生和他的大家庭一年。

因此,在我出于纯粹的挫败感而自杀并使我的孩子成为孤儿之前——我该怎么做呢?

0 投票
1 回答
300 浏览

c++ - 将 std::function 作为参数传递时的问题

我在使用 clang 3.1(gcc 工作正常)时遇到了这个奇怪的问题(我在这里简化了代码)。是不当使用 std::function (按值传递)还是 clang 错误?

我在 Max OS X Lion 上使用 Apple clang 4.1 (llvm 3.1)。

如果我将第二个参数的类型更改为其他类型(例如 int),则一切正常。

如果我直接从 ctor 构造 A 对象,而不是使用“make”工厂,那么一切正常。

我真的不明白这是一个clang bug还是我的误解。

0 投票
3 回答
2536 浏览

c++ - 包含 std::function 的映射和 std::function

我想要一个将字符串键映射到 astd::function<T()>std::function<T(int)>(但对于给定键不能同时映射到两者)的映射。我收到一个编译错误,似乎没有std::function<T(...)>. 我希望能够使用 lambdas 作为值。

首先,以这种方式存储函数是否安全?其次,如果是这样,语法是什么?(从地图中检索到该函数是一元还是零元时,将知道它。)如果以上都不是,那么合理的替代方案是什么?指针扼杀了 lambda 的想法,对吧……

C++11 没问题。

0 投票
3 回答
14171 浏览

c++ - std::function 与原始函数指针和 void* this 相比的性能?

库代码:

申请代码:

以上是回调机制的最小实现。它更冗长,不支持绑定、占位符等,例如 std::function。如果我对上述用例使用std::functionor boost::function,会有任何性能缺陷吗?此回调将处于实时应用程序的非常关键的路径中。我听说 boost::function 使用虚函数来进行实际的调度。如果不涉及绑定/占位符,那会被优化吗?

更新

对于那些有兴趣在最新编译器中检查程序集的人:https ://gcc.godbolt.org/z/-6mQvt