首页 > 解决方案 > C++ Lambda 到函数指针

问题描述

我有三个班级:

class ShapeEditor {}
class PointEditor: ShapeEditor{}
class RectEditor: ShapeEditor{}

我想在Manager类中定义一个函数指针并将其作为 lambda 函数传递给构造函数。它看起来像这样:

class Manager {
public:
  ShapeEditor (*factory)();
  Manager(ShapeEditor (*_factory)());
}

然后我主要写:

Manager m = Manager([] { return PointEditor(); }

并收到一条错误消息,指出此表达式没有构造函数。

当我更改ShapeEditorPointEditorin Manager- 它工作正常,但我需要在函数结果中指定不同的类型。

标签: c++functionc++11pointers

解决方案


正如我所看到的,您的问题是尝试将PointEditor实例转换为ShapeEditor实例。您需要转换指针,而不是值。因此,在您的 lambda 表达式中,您将返回本地实例的 COPYPointEditor并尝试将其复制到ShapeEditor本地变量中。

这是我的建议:

#include <cmath>
#include <cstdio>
#include <map>
#include <iostream>

using namespace std;

class ShapeEditor {
public:
    virtual void printName(){};
};

class PointEditor: ShapeEditor{
    
public:
    void printName(){cout << "PointEditor\n";};
};

class RectEditor: ShapeEditor{
    
public:
    void printName(){cout << "RectEditor\n";};
};

class Manager {
    ShapeEditor* shp;
    ShapeEditor* (*factory) ();
public:
    Manager( ShapeEditor* (*_factory)() ):factory{_factory}{
        shp = factory();
        shp->printName();
    };
    
    ~Manager(){delete shp;}
};

int main()
{
    
    ShapeEditor* (*func1)() = [](){
        PointEditor* x = new PointEditor();
        ShapeEditor* s = (ShapeEditor*)x;
        return s;
        
    };
    
    ShapeEditor* (*func2)() = [](){
        RectEditor* x = new RectEditor();
        ShapeEditor* s = (ShapeEditor*)x;
        return s;
    };
    
    Manager m1 = Manager(func1);
    Manager m2 = Manager(func2);
    
    return 0;
}

输出:

PointEditor
RectEditor

推荐阅读