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

c# - Marshal::GetFunctionPointerForDelegate: 我应该发布它的结果吗?

我正在将托管 System.Action 转换为 C++/CLI 项目中的非托管 std::function;我应该在使用回调后释放给定的 IntPtr,还是没有必要?

0 投票
1 回答
288 浏览

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::asyncand的非常关键的点std::thread

0 投票
2 回答
3261 浏览

c++ - 具有不同参数的 std::functions 集合

我正在尝试编写一个简单的调度程序,用户代码可以将回调附加到它。每个事件都有一个已知的签名,用户代码需要使用正确的数字和参数类型调用调度。这是由可变参数管理的。但是,不接受 freestandingInt,因为向量的类型不正确。如何使其通用?

遵循一个最小的例子

0 投票
3 回答
3556 浏览

c++ - C++11 lambda 是如何表示和传递的?

在 c++11 中传递 lambda 非常简单:

但我想知道,将 lambda 传递给这样的函数的成本是多少?如果 func 将 lambda 传递给其他函数怎么办?

lambda 的传递是否昂贵?由于可以function为对象分配 0,

它让我认为函数对象有点像指针。但如果不使用new,则意味着它们可能类似于值类型struct或类,默认为堆栈分配和成员复制。

当您“按值”传递函数对象时,如何传递 C++11“代码体”和一组捕获的变量?代码体是否有很多多余的副本?我是否必须标记每个function传递的对象const&以免复制:

或者函数对象的传递方式是否与常规 C++ 结构不同?

0 投票
1 回答
6088 浏览

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().

0 投票
5 回答
67536 浏览

c++ - 如何在 Visual Studio 11 中将成员函数直接绑定到 std::function?

std::function我可以通过使用带有捕获子句的 lambda 表达式包装成员函数来轻松地将它们绑定到 a 。

但我想直接绑定它们,如下所示。

我认为根据 C++11 标准,应该支持这个。但是,在 Visual Studio 11 中,我得到了这些编译器错误。

错误 C2440:“换行符”:无法从“int”转换为“类 *”

错误 C2647:“.*”:无法取消引用“int”上的“void (__thiscall Class::*)(int)”

0 投票
2 回答
3170 浏览

c++ - 带有 unique_ptr 参数的 std::function

给定一个函数

不可能(MSVC 2012)创建一个仿函数

问题不在于绑定 - 使用auto f = std::bind(...)工作。此外,使用 ashared_ptr也可以

  • 为什么 unique_ptr 不允许?
  • 这是 MSVC 问题还是一般 C++11 限制?
  • 有没有不改变函数定义的变通方法?
0 投票
2 回答
1298 浏览

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的一个的指针。我怎么做错了?您还需要哪些额外信息?

更新:这是我的代码。

0 投票
2 回答
28428 浏览

c++ - C++ 函数类型

我在理解函数类型时遇到问题(例如,它们显示为Signaturea 的模板参数std::function):

变量f不能赋值,但可以调用。诡异的。那有什么用呢?

现在,如果我对 typedef 进行 const 限定,我仍然可以使用它来构建更多类型,但显然没有别的:

我在这里遇到了语言的哪个偏远角落?这种奇怪的类型是如何调用的,我可以在模板参数之外使用它做什么?

0 投票
3 回答
1098 浏览

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,我可以将它们继承到具有显式构造函数的类中。

是否有其他可用的建议或选项?