piz*_*lms 2 c++ lambda function-pointers c++11
我对C++比较陌生,在Obj-C上度过了多年,并想知道如何将Obj-C中的闭包块添加到C++类中.这是我想要做的一些伪代码:
class Slider
{
public:
void onMouseDown()
{
if(rightClick or ctlKeyDown)
{
if(myFunctionPointer != nil)
{
// show popup menu
myFunctionPointer(this);
}
}
}
FunctionPointer myFunctionPointer = nil;
};
class Editor
{
public:
void showPopupMenu(Slider *s)
{
// build the popupMenu with information based on the slider
}
void init()
{
// create a slider and connect the popupMenu function to it
mySlider = new Slider;
mySlider->functionPointer = showPopupMenu();
}
Slider *mySlider;
};
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我正在尝试让我的Slider类调用函数而不知道它的任何内容.
这应该不是那么困难,但我有兴趣以最佳/正确的方式做到这一点.Lambdas和仿函数看起来令人难以置信.也许我正在寻找别的东西.但是什么?
在将函数视为对象时,您的基本选项是:函数指针,functor/lambda,std :: function.我将假设你可以找到他们的语法,并将重点放在他们的差异上.
当不需要闭包时,应该使用函数指针.当您要调用的过程是无状态或具有全局状态,并且范围中包含所有参数时,这适用.
当您需要创建闭包时,应该使用仿函数.由于仿函数是对象,因此可以保持内部状态并在闭包内传递参数.
lambda本质上是一个仿函数,没有明确的类型名.如果lambda的捕获列表是作为functor实现的,那么它就是它的成员.请注意,您可以operator()为仿函数而不是lambda 重载.
functor/lambdas的问题是它们的每个定义都有不同的类型,并且可能不适合函数签名/类成员类型.std :: function通过接受functor/lambda/function指针并将它们转换为统一类型的std :: function来解决问题.您可以通过性能的形式为这种灵活性支付(通常很小)的价格.
| 归档时间: |
|
| 查看次数: |
1968 次 |
| 最近记录: |