问题标签 [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 回答
2944 浏览

c++ - g++:用闭包类型初始化的 std::function 总是使用堆分配?

互联网上的一些消息来源(特别是这个)说 std::function 使用小闭包优化,例如,如果闭包大小低于一定数量的数据,它不会分配堆(上面的链接表示 gcc 为 16 个字节)

所以我去挖掘 g++ 标头

看起来是否应用这种优化是由“功能”标头中的这段代码决定的(g ++ 4.6.3)

和一些线路:

例如,如果 _Local_storage() 为 true_type,则调用placement-new,否则 - 常规 new

_Local_storage 的定义如下:

和 __stored_locally:

最后:__is_location_invariant:

所以。据我所知,闭包类型既不是指针也不是成员指针。为了验证我什至写了一个小测试程序:

输出是:

所以,我的问题如下:用 lambda 初始化 std::function 是否总是导致堆分配?还是我错过了什么?

0 投票
2 回答
924 浏览

c++ - 为 std::function 声明指向成员函数模板参数的“不完整类型”错误

这是声明:

这给了我错误

在函数'double fA(std::function)'中:tb.cpp:32:8: 错误:'fp' 的类型不完整

虽然没有问题

将此类型作为模板参数提供给的正确方法是std::function什么?

0 投票
1 回答
3726 浏览

c++ - 将 std::function 分配给成员函数

0 投票
3 回答
688 浏览

c++ - 为什么这里的三元运算符与 if-else 不一样?

我正在使用 TR1std::function来实现一个简单的回调机制。如果我不想被回调,我注册nullptr为回调处理程序。这可以编译并正常工作:

如果我使用三元运算符重写它......

... VC++ 的编译器说:

错误 C2446: ':' : 没有从 'nullptr' 转换为 'std::tr1::_Bind<_Result_type,_Ret,_BindN>' 1> with 1>
[ 1> _Result_type=void, 1> _Ret=void, 1>
_BindN=std::tr1::_Bind2,Foo *,std::tr1::_Ph<1>> 1> ] 1> 没有构造函数可以采用源类型,或者构造函数重载决议不明确

这是编译器的限制,还是我在做一些愚蠢的事情?我知道在这种特殊情况下,我可能不会从使用三元运算符中获得任何好处,但我只是好奇。

0 投票
4 回答
4375 浏览

c++ - 将gsl与c ++一起使用时如何避免静态成员函数

我想在 c++ 类中使用 GSL,而不将成员函数声明为static. 这样做的原因是因为我不太了解它们,而且我不确定线程​​安全性。根据我的阅读,std::function可能是一个解决方案,但我不确定如何使用它。

我的问题归结为如何static在声明中删除g

更新(1)

我尝试更改gsl_monte_function G = { &g, 3, 0 };为,gsl_monte_function G = { bind(&A::g, this,_1,_2,_3), 3, 0 };但没有成功

更新(2):我尝试使用将 std::function 分配给成员函数,但它也不起作用。

更新(3) 最后我写了一个非成员函数:

它有效,但它是一个混乱的解决方案,因为我需要编写一个辅助函数。使用 lambdas、function 和 bind,应该有一种方法可以让类中的所有内容都符合逻辑。

0 投票
1 回答
10365 浏览

c++ - 将 lambda 分配给 std::function

当推断的返回类型为 std::nullptr_t 时,为什么允许第二次赋值?对于函数指针,这是禁止的。

为什么第二个 lambda 不运行?

0 投票
1 回答
182 浏览

c++ - 指向函数和 std::function 的指针:第一个编译而不是第二个?

我不熟悉指向函数的指针,我目前正在做一些测试。但是在下面的程序中,我不明白为什么第一个版本可以工作,为什么第二个版本不能编译。什么是正确的语法?

错误如下:

0 投票
1 回答
262 浏览

c++ - c ++将std :: function从另一个类传递给构造函数

我将一个方法传递给一个构造函数,但是当我使用另一个类的方法时,它给了我一个错误。

它目前正在以这种形式工作;

但是,如果我像这样引用另一个头文件的方法;

我在运行时收到错误消息,并显示以下消息;

我的 hashmap 构造函数如下所示;

其中 hfunc 是方法的 typdef。

我有一个类 HashFcn 它有方法 primeHash

这是我第一次做 typdef / 方法传递——任何线索或帮助将不胜感激!

0 投票
1 回答
761 浏览

c++ - GCC 错误与否:默认 std::function?

如何将默认函数指定为类成员的参数?

从我的代码派生的当前示例是:

它是 GCC 的错误吗?

是否可以使用另一种语法来避免这个问题?

你能在其他 C++11 编译器上试试吗(对于有编译器的人)?

0 投票
1 回答
6766 浏览

c++ - std::function 和 Signal/Slot 系统

我正在尝试在 C++ 中创建一个简单的 Signals/Slots 系统而不使用 boost,但是当我尝试将它与参数一起使用时遇到了一些问题,这是我的代码:

我的信号课:

我的测试课:

所以,我像这样使用我的课程:

我在 Signal.cpp 中收到警告: 候选函数不可行:第一个参数没有从 'void (*)(int)' 到 'int' 的已知转换;

在这段代码中:

我该如何解决?如果我想给我的“发射”方法一个对象或多个参数,我可以做吗?

谢谢!