c++ - 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(); }
并收到一条错误消息,指出此表达式没有构造函数。
当我更改ShapeEditor
为PointEditor
in Manager
- 它工作正常,但我需要在函数结果中指定不同的类型。
解决方案
正如我所看到的,您的问题是尝试将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
推荐阅读
- php - 如何在此 Codeigniter 3 应用程序中将 base_url 传递给 twig 模板?
- node.js - 当我的节点版本比请求的版本新时,为什么会收到有关我的节点版本的错误?
- c# - 在需要私有变量来模拟行为的情况下,对代码进行单元测试的有效方法是什么?
- unreal-engine4 - 试图让虚幻引擎中的按钮影响所有级别
- uml - 什么是序列图中的非瞬时和持续时间消息
- python - 在“用户:”之后使用正则表达式获取所有用户
- asp.net-mvc - MVC:当ModelState在Controller中有效时显示一个弹出窗口
- java - 使用哪一个:HashMap 和 ConcurrentHashMap 与未来值 JAVA?
- javascript - 有没有更好的迭代和比较 2 个数组中的对象的方法?
- gatsby - Gatsby 和 Leaflet:检查 `LeafletMap` 的渲染方法