问题标签 [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.
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>
了,我得到了错误。
c++ - lambda 的 Lambda :未捕获该函数
以下程序无法编译:
因为 :
这是什么意思以及如何解决问题?
c++ - 为什么 std::function 不是有效的模板参数,而函数指针是?
我已经定义了名为的类模板CallBackAtInit
,其唯一目的是在其初始化(构造函数)时调用一个函数。该函数在模板参数中指定。问题是模板不接受std::function
作为参数;但他们接受函数指针。为什么?
这是我的代码:
c++ - std::function 模板参数解析
我目前正在开发一个链接函数对象的库。
我正在创建一个函数模板,它接受一个可调用对象(目前是 std::function),并根据函数的输出和输入类型进行参数化。这是我定义的简化版本:
我遇到的问题是使用情况。似乎当我传递一个 lambda 时,编译器无法正确推断出类型,因此抱怨该函数不存在:
如果我将 lambda 显式包装在 中std::function
,则程序将编译:
我还没有测试过传递函数指针或函数对象,但如果我不直接传递显式对象,编译器似乎很难推断出In
and参数。Out
std::function
我的问题是:有没有办法解决这个问题,这样我就可以推断出可调用对象的输入/返回类型,而无需在调用站点明确提及它们?
也许在函数类型而不是输入/返回类型上参数化模板?本质上,我需要推断任意可调用对象的In
and类型。模板函数的返回类型Out
可能是某种auto
/技巧?decltype
谢谢你。
c++ - 函数包装器初始化如何在 C++11 中工作?
如果我有这门课
我如何知道 keyPressHandler 是否已设置?我可以将其初始化为 NULL 然后对其进行测试吗?
c++ - 并行使用 std::thread?
我是 std::thread 的新手,我尝试编写一个parallel_for
. 我编码了以下内容:
但这不起作用:(来自 g++ 4.6 的错误代码)
如何解决这个问题呢 ?
编辑:这个新版本编译但没有给出好的结果:
结果是:
并行版本返回 4950,而顺序版本返回 155..... 问题出在哪里?
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 函数的调用:X
Y::call_it
并将适当的函数X
作为参数绑定到它:
显然,这是错误的,我解决此问题的所有其他尝试也是如此。(我现在才玩std::bind()
了 10 周,所以请多多包涵)。最后,我迷失在一个令人难以置信的迷宫中,这些错误信息来自std::function
模板化的胆量,这些信息会让一个成年人落泪,至少应该养活一个心理医生和他的大家庭一年。
因此,在我出于纯粹的挫败感而自杀并使我的孩子成为孤儿之前——我该怎么做呢?
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还是我的误解。
c++ - 包含 std::function 的映射和 std::function
我想要一个将字符串键映射到 astd::function<T()>
或std::function<T(int)>
(但对于给定键不能同时映射到两者)的映射。我收到一个编译错误,似乎没有std::function<T(...)>
. 我希望能够使用 lambdas 作为值。
首先,以这种方式存储函数是否安全?其次,如果是这样,语法是什么?(从地图中检索到该函数是一元还是零元时,将知道它。)如果以上都不是,那么合理的替代方案是什么?指针扼杀了 lambda 的想法,对吧……
C++11 没问题。
c++ - std::function 与原始函数指针和 void* this 相比的性能?
库代码:
申请代码:
以上是回调机制的最小实现。它更冗长,不支持绑定、占位符等,例如 std::function。如果我对上述用例使用std::function
or boost::function
,会有任何性能缺陷吗?此回调将处于实时应用程序的非常关键的路径中。我听说 boost::function 使用虚函数来进行实际的调度。如果不涉及绑定/占位符,那会被优化吗?
更新
对于那些有兴趣在最新编译器中检查程序集的人:https ://gcc.godbolt.org/z/-6mQvt