问题标签 [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# - Marshal::GetFunctionPointerForDelegate: 我应该发布它的结果吗?
我正在将托管 System.Action 转换为 C++/CLI 项目中的非托管 std::function;我应该在使用回调后释放给定的 IntPtr,还是没有必要?
asynchronous - 访问异步任务中的可调用对象与使用 std::cin 冲突
1) 使用 Visual Studio 2012 构建并运行上述代码。
2) 行 (A) 触发访问冲突_VARIADIC_EXPAND_P1_0(_CLASS_FUNC_CLASS_0, , , , )
:
ConsoleApplication1.exe 中 0x0F96271E (msvcp110d.dll) 的第一次机会异常:0xC0000005:访问冲突写入位置 0x0F9626D8
最令人困惑的是,可以通过删除行 (B) 来避免异常。
问题
- 为什么可调用对象
notify
显然与使用冲突std::cin
? - 这段代码有什么问题?
这个简化示例的真实场景是一个函数,它并行执行一些代码,并在完成后让该代码调用用户提供的通知函数。
编辑
我在我的代码中发现了至少一个问题:background
变量一StartBackground()
退出就被销毁。由于std::async
可能会或可能不会启动单独的线程,并且如果线程仍然可以连接,则std::thread
调用,这可能会导致问题。terminate()
以下变体有效,因为它为任务提供了足够的时间来完成:
std::future
让对象在较长时间内保持活动而不是休眠也应该有效。但是下面的代码也会导致同样的访问冲突:
而以std::thread
相同的方式使用 a 按预期工作:
我完全不解。我必须在这里遗漏一些关于std::async
and的非常关键的点std::thread
。
c++ - 具有不同参数的 std::functions 集合
我正在尝试编写一个简单的调度程序,用户代码可以将回调附加到它。每个事件都有一个已知的签名,用户代码需要使用正确的数字和参数类型调用调度。这是由可变参数管理的。但是,不接受 freestandingInt,因为向量的类型不正确。如何使其通用?
遵循一个最小的例子
c++ - C++11 lambda 是如何表示和传递的?
在 c++11 中传递 lambda 非常简单:
但我想知道,将 lambda 传递给这样的函数的成本是多少?如果 func 将 lambda 传递给其他函数怎么办?
lambda 的传递是否昂贵?由于可以function
为对象分配 0,
它让我认为函数对象有点像指针。但如果不使用new
,则意味着它们可能类似于值类型struct
或类,默认为堆栈分配和成员复制。
当您“按值”传递函数对象时,如何传递 C++11“代码体”和一组捕获的变量?代码体是否有很多多余的副本?我是否必须标记每个function
传递的对象const&
以免复制:
或者函数对象的传递方式是否与常规 C++ 结构不同?
c++ - Store and passing std::function's - by value or by reference?
I'm having trouble knowing when to pass/store std::function objects by value or reference, or if I need to use move semantics somehow. I have a struct that stores two std::function
objects:
I also have a class that contains a vector of these structs, and I'd like to initialize it in a function resembling this one:
I'd like to be able to pass lambda expressions directly to the Control constructor, and eventually do this repeatedly:
I've encountered a lot of errors and crashes trying to implement this idea, so I need to know
- Should the
std::function
's be stored by (const?) reference, or by value, taking into account they capture a reference? - Should they be passed to the Control constructor by (const?) reference, or value, (or moved, somehow)?
- Is it alright to store the Controls by value in a vector this way, or will I need to use an alternative (
unique_ptr<Control>
, etc.)? - when I loop through the controls vector, should I be accessing them by value, or by reference?
Assume that the Player&
object is always in scope for Screen::update()
.
c++ - 如何在 Visual Studio 11 中将成员函数直接绑定到 std::function?
std::function
我可以通过使用带有捕获子句的 lambda 表达式包装成员函数来轻松地将它们绑定到 a 。
但我想直接绑定它们,如下所示。
我认为根据 C++11 标准,应该支持这个。但是,在 Visual Studio 11 中,我得到了这些编译器错误。
错误 C2440:“换行符”:无法从“int”转换为“类 *”
错误 C2647:“.*”:无法取消引用“int”上的“void (__thiscall Class::*)(int)”
c++ - 带有 unique_ptr 参数的 std::function
给定一个函数
不可能(MSVC 2012)创建一个仿函数
问题不在于绑定 - 使用auto f = std::bind(...)
工作。此外,使用 ashared_ptr
也可以
- 为什么 unique_ptr 不允许?
- 这是 MSVC 问题还是一般 C++11 限制?
- 有没有不改变函数定义的变通方法?
c++ - 执行绑定的 std::function 抛出 std::bad_function_call
我想将成员函数绑定到std::function<void(void)>
. 我听说成员函数需要一个额外的参数,即实例指针。因此我调用std::bind(&Class::Function, this, parameter)
但是当我执行函数对象时,它会引发运行时错误。
Application.exe 中 0x748D4B32 处未处理的异常:Microsoft C++ 异常:内存位置 0x0114F4E8 处的 std::bad_function_call。
该参数是指向我自己struct
的一个的指针。我怎么做错了?您还需要哪些额外信息?
更新:这是我的代码。
c++ - C++ 函数类型
我在理解函数类型时遇到问题(例如,它们显示为Signature
a 的模板参数std::function
):
变量f
不能赋值,但可以调用。诡异的。那有什么用呢?
现在,如果我对 typedef 进行 const 限定,我仍然可以使用它来构建更多类型,但显然没有别的:
我在这里遇到了语言的哪个偏远角落?这种奇怪的类型是如何调用的,我可以在模板参数之外使用它做什么?
c++ - 非成员函数中的隐式参数转换歧义用 std::function 重载?
已编辑 - 请跳到真正有问题的编辑
我经常在独立函数的字符串帮助程序库中遇到这种情况,我在其中提供函数的重载,其中版本采用 achar
和采用std::string
.
问题是,当传递一个字符串字面量 ( const char*
) 时,重载就会变得模棱两可。
例子:
这两个函数的实现方式不同,一个针对字符串进行了优化,一个针对单个字符进行了优化。但是,尽管我一直希望它调用版本,但尝试调用myFunc("literal")
会导致模棱两可。std::string
这迫使我提供void myFunc(const char *str)
我的重载版本,这些版本只是存根,例如:
有没有办法让这些存根函数变得不必要?我只想能够使void myFunc(char c)
'显式',但你不能使非构造函数非成员函数显式。这将立即解决问题。=(...
(顺便说一句,为什么你不能明确独立的功能?)
编辑: 你知道他们说程序员编码太晚了!(如果你还记得那个笑话,告诉我,因为我最初听到的时候太困了,现在我已经忘记了)
真正的问题
我正在使用 MinGW v4.7.2,问题与我最初假设的问题有很大不同。
问题是,我有几个重载。是的,这个例子工作正常:
但是如果你添加一个 std::function 重载,它就会崩溃:
我的字符串库有 std::string、char 和 std::function 重载(偶尔还有一些重载用于简化带有大量可选参数的函数)。
当我将 std::function 作为重载时,我收到以下错误消息:
myFunc(char) 是我昨晚最初感到困惑的原因。从代码中删除该重载,我收到错误消息:
这是一个独立的可编译示例。
如何使字符串文字选择 std::string 而不是 std::function?这可能是模棱两可的,因为 std::function 的构造函数是模板化的,并且设计用于获取函数指针等。
因为我的字符串库,具体来说,只使用std::function<bool(char)>
and std::function<bool(const std::string&)>
,已经 typedef'd,我可以将它们继承到具有显式构造函数的类中。
是否有其他可用的建议或选项?