函数指针,Functor或Lambda?

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和仿函数看起来令人难以置信.也许我正在寻找别的东西.但是什么?

Daf*_*Cao 5

在将函数视为对象时,您的基本选项是:函数指针,functor/lambda,std :: function.我将假设你可以找到他们的语法,并将重点放在他们的差异上.

当不需要闭包时,应该使用函数指针.当您要调用的过程是无状态或具有全局状态,并且范围中包含所有参数时,这适用.

当您需要创建闭包时,应该使用仿函数.由于仿函数是对象,因此可以保持内部状态并在闭包内传递参数.

lambda本质上是一个仿函数,没有明确的类型名.如果lambda的捕获列表是作为functor实现的,那么它就是它的成员.请注意,您可以operator()为仿函数而不是lambda 重载.

functor/lambdas的问题是它们的每个定义都有不同的类型,并且可能不适合函数签名/类成员类型.std :: function通过接受functor/lambda/function指针并将它们转换为统一类型的std :: function来解决问题.您可以通过性能的形式为这种灵活性支付(通常很小)的价格.

  • 我认为我不同意你对函数指针的建议 - 你所描述的是它们使用的*必要​​条件,但不是*足够*条件.使用函数指针而不是`std :: function`是*optimization*,可能是一个过早的. (2认同)
  • @hurkyl另外,在std函数上使用函数指针的充分理由包括需要nothrow复制/构造,constexpr评估值或模板非类型参数,标准布局和其他pod要求,无状态保证等.我错过了你认识的重要人物吗? (2认同)