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

c++ - std::function typedef 中的参数名称

我知道我可以std::function像这样 typedef :

是否允许在 typedef 中指定参数名称,以使其更具自文档性?例如:

我可以添加参数名称,它在 Visual C++ 2010 上编译得很好,但我想确保 C++03/C++11 标准允许它。

0 投票
2 回答
1998 浏览

javascript - 如何将 std::function 绑定到 JavaScript V8?

我刚开始使用JavaScript V8并从Embedder's Guide编译了一个基本示例。现在我想将 C++ 函数绑定到 JavaScript 上下文。

现在我只有一个或多或少的空白类,稍后应该处理绑定。

如何将std::function对象绑定到 JavaScript V8 上下文?

0 投票
1 回答
1462 浏览

c++ - 如何从 std::function 获取这个指针?

由于std::function可以保存成员函数,所以它必须在某处存储指向对象实例的指针。

如何从包含成员函数this的 a 中获取指针?std::function

0 投票
2 回答
6876 浏览

c++ - 将存储在 std::function 中的带有捕获子句的 lambda 转换为原始函数指针

由于我最近的最后一个问题不幸措辞并导致解决了另一个问题,然后是我的问题,因此我将尝试以清晰的方式阐述我的实际问题。

在开始之前,作为旁注,我将 Javascript Engine V8 集成到我的 C++ 应用程序中。这就是示例中所有类型的来源。这也是我最后需要一个原始函数指针的原因。但我在下面详细说明。

从一个类内部,我需要将带有捕获子句的 lambda 表达式[=]作为类型的参数传递std::function给另一个函数,并将其转换为那里的原始函数指针。

在这段代码中,InvocationCallback只是一个带有签名的函数的 typedef Handle<Value>(Arguments const &)

所有 lambda 表达式也具有相同的签名。请注意,与此示例Handle<String>中的兼容Handle<Value>。它也是由 Javascript Engine V8 提供的。

C++ 允许我将这个 lambda 传递std::function给上面的函数。但我猜一个 lambda 表达式也存储了它所引用的对象的引用。[=]必须以某种方式实现指定的访问权限。这可能是转换std::function为原始函数指针失败的原因。

既没有编译时错误也没有运行时错误,但调试器告诉我它会导致空指针。但我需要原始函数指针进行进一步处理。我想我可以先std::bind在引用或this-pointer 之后转换 lambda。

更新:由于似乎不可能从 lambda 中获取状态,这就是我尝试过的。它编译但function出来是一个空指针。

0 投票
1 回答
953 浏览

c++ - C ++:使用std :: function在multiset中插入元组,并保持顺序

很简单,这段代码有什么问题?

g++ 4.7.2简单地使用 - with 命令编译g++ -std=c++11 main.cpp

我为什么要这样做?

程序是实时运行的,add_even_handler函数中包含一个类型double为 called的值time(注意time这里的变量与时钟或实际时间无关,它只是一个 double 类型的递增对象)。因此,当用户添加一些事件时,它将在某个时间被调用。

标准下的多集容器将按某种顺序整理对象(通常,如果不总是,std::less<T>)。然后循环遍历容器,我可以Event在不断增加的变量变化时调用double time

问题是什么?

正如 KyleC 所指出的(见他的回答),std::function<>编译器不理解在​​什么过程中订购

我是如何克服这个问题的

你每天学习新的东西。上面的代码是最初混合std::multisetstd::tuple. std::map<T,S>orstd::multimap<T,S>也按关联的排序key,在这种情况下是 type double,默认情况下它也是std::less<T>。所以代替上面的,我做了类似下面的事情

这只是写在这里,以防它可能对人们有所帮助,尽管很明显但仍然如此。

0 投票
2 回答
749 浏览

c++ - 将函数对象指针传递给函数接受指向 std::function 的指针

我想将不同类型但签名相同的函子传递给方法。因此我得出结论,应该使用 std::function 。但是由于这个方法还应该存储对函数对象的引用,所以我想传递一个 shared_ptr 来代替(用于生命周期管理)。下面的代码适用于 B 类(b.run(...)),但无法为 A 类编译(a.run(...) 中断)。当传递一个指针而不是函数对象本身时,这个转换问题的原因是什么?我该如何规避它?

编译器错误:

现在我发现如果 MyFunctor 从 std::function 继承,a.run(...) 可以编译:

为什么现在可以使用?如果函子中不需要更改代码,我会更好。

0 投票
0 回答
1057 浏览

c++ - 使用 lambda 启动 pthread

由于我无法控制的原因,我必须使用堆栈大小减小的 pthread。但是,我仍然可以访问 C++11,所以我想写一些类似的东西std::async,让我在分离状态下启动一个 pthread,并运行任何函数,而不返回未来。本质上,std::async 用于返回 void 的函数。

我想出了以下代码,但它真的很难看,我想知道是否有更好的方法来解决这个问题。

0 投票
2 回答
1901 浏览

c++ - 理解 std::function 和 std::bind

我正在玩 std::function 和 std::bind ,我注意到一些不直观的东西,我想更好地理解它。

例如:

如何将 a 绑定function<void(int)>void()函数。然后我可以调用 f(1) 并获得 fun()。我想了解这是如何完成的。深入 Microsoft Visual Studio 2012 的实现让我迷失在无法阅读的宏的海洋中。所以这就是我在这里问这个问题的原因。

0 投票
1 回答
2392 浏览

c++ - 将抽象函子分配给 std::function - 为什么 std::ref 是一个解决方案?

我想将仿函数对 std::function 的分配封装到一个方法中。我必须传递从通用抽象类 Slot 继承的仿函数,而不是传递 std::function 或指向 std::function 的指针(即,这些槽提供附加功能)。

我在这里以不同的形式偶然发现了这个问题。例如,使用通用槽指针而不是 std:functions 的动机是函子的生命周期管理。

下面的代码说明了这个问题。请参阅 assignFunctorPtr(...) 方法。

如果在 assignFunctorPtr(...) 中使用版本 B,则此代码会中断。

如果使用 assignFunctorPtr(...) 中的版本 A,它会编译。

  • 如果 std::ref 用于包装仿函数,为什么它会编译?
  • 因此 std::function 对仿函数的具体要求是什么(另见std::function 参考
  • 解决此问题的正确/最佳方法是什么?
  • 使用 std::ref 可以节省吗?
0 投票
1 回答
154 浏览

c++ - std::function() 在 VS2010 中编译 C++11 代码时是否检查类型?

std::function()在我的代码中使用 C++11 和 VS2010。这是我的代码。

很明显,代码不正确,因为myfunc对象没有正确初始化。该myfunc对象应由function<string (string)>整数类型以外的对象赋值。当运行到代码时myfunc(string());std::function对象抛出bad_function_call()并得到错误。

但是,让我困惑的是为什么 C++11 在编译时不检查类型?这很奇怪,因为缺少类型检查会让程序员很容易意外地弄乱代码,直到运行到相应的错误行。

所以我想问一下:std::function()VS2010中编译C++11代码时是否检查类型?如果没有,有什么办法可以解决这个问题吗?