将 std::function 转换为 std::function

2024-01-08

首先,我定义两个类,它们相互继承。

class A {
};
class B : public A {
};

然后,我声明一个使用std::function<void(A*)> :

void useCallback(std::function<void(A*)> myCallback);

最后,我收到一个std::function我想在回调函数中使用与其他地方不同的(但理论上兼容的)类型:

std::function<void(B*)> thisIsAGivenFunction;

useCallback(thisIsAGivenFunction);

我的编译器(clang++)拒绝这样做,因为thisIsAGivenFunction与预期类型不匹配。但与B继承自A,这对于thisIsAGivenFunction是可以接受的。

应该是吗?如果没有,为什么?如果应该的话,那么我做错了什么?


假设您的类层次结构更大一些:

struct A { int a; };
struct B : A { int b; };
struct C : A { int c; };

并且你有如下功能:

void takeA(A* ptr)
{
    ptr->a = 1;
}

void takeB(B* ptr)
{
    ptr->b = 2;
}

有了这个,我们就可以说takeA is callable与派生类的任何实例A (or A本身),并且takeB is callable与类的任何实例B:

takeA(new A);
takeA(new B);
takeA(new C);

takeB(new B);
// takeB(new A); // error! can't convert from A* to B*
// takeB(new C); // error! can't convert from C* to B*

怎么办std::function是,它是一个可调用的包装器对象。它不太关心存储的函数对象的签名只要该物体是callable及其参数std::function包装:

std::function<void(A*)> a; // can store anything that is callable with A*
std::function<void(B*)> b; // can store anything that is callable with B*

你想做的就是转换std::function<void(B*)> to std::function<void(A*)>。换句话说,您想要存储可调用对象B*在函数的包装类中A*。是否存在隐式转换A* to B*?不,那里没有。

也就是说,我们也可以调用std::function<void(A*)>带有指向类实例的指针C:

std::function<void(A*)> a = &takeA;
a(new C); // valid! C* is forwarded to takeA, takeA is callable with C*

If std::function<void(A*)> could wrap可调用对象的实例仅采用B*,你希望它如何与C*?:

std::function<void(B*)> b = &takeB;
std::function<void(A*)> a = b;
a(new C); // ooops, takeB tries to access ptr->b field, that C class doesn't have!

幸运的是,上面的代码无法编译。

但是,以相反的方式执行此操作也可以:

std::function<void(A*)> a = &takeA;
std::function<void(B*)> b = a;
b(new B); // ok, interface is narrowed to B*, but takeA is still callable with B*
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 std::function 转换为 std::function 的相关文章

  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke

随机推荐

  • 如何在快速 api 视图上添加文档以发布身体模型?

    例如 假设我们有两个端点 class FooRequest BaseModel data str router post foo response model FooRequest async def foo view data FooRe
  • mysql 查询中区分大小写的表名

    我有 php 代码 其中数据库表名称的首字母在每个地方都是大写字母 但数据库中的表名称是小写的 我应该使用什么全局设置 以便无需更改每个代码文件来使表名的大小写与数据库中的大小写相同 Linux 上的 MySQL 元数据默认区分大小写 也就
  • 启用 @KafkaListener 从 application.yml 文件中获取变量主题名称

    我正在尝试将多个主题加载到一个主题中 KafkaListener但我遇到了麻烦 因为我相信它正在寻找一个恒定值 但正在初始化topics变量来自application yml文件导致出现问题 我想知道是否有人可以帮助我解决这个问题 或者为我
  • 从 .json 文件创建 kubernetes 机密

    我有一个 json 文件 其中包含一些像这样的键 a someval b someval more keys 如何将这些密钥添加到 kubernetes 中的秘密中 当我尝试时 kubectl create secret generic m
  • 为什么 pathlib.Path("C:") 解析为 Windows 上的工作目录?

    在 Windows 7 x64 上使用 Python 3 6 路径 C 看起来与空路径相同Path resolve 空 路径是 当前工作目录 cwd gt gt gt from pathlib import Path gt gt gt Pa
  • 关于二元谓词 Compare

    我的参考是二元谓词Compare comp预计在超载std 下界 https en cppreference com w cpp algorithm lower bound etc 描述如下 谓词函数的签名应该等于 下列的 bool pre
  • 在电脑上将fabricjs画布另存为图像

    我想通过单击 html 页面中的按钮将 Fabric 画布保存为 PC 上的图像 jpg 或 png 相同 我尝试了一个解决方案但不起作用 function saveF canvF var imageCanv canvF toDataURL
  • 如何在 struts2 文本字段标记中放置占位符?

    我正在使用 struts2 标签并想在 a 中放置一个占位符
  • iOS 10.3 中的替代图标

    我有关于如何在 iOS 10 3 中设置备用图标的信息 在 Info plist 中添加密钥 然而 我不确定每个替代方案需要哪些尺寸 我现在使用资源文件夹 并且必须放入大约 12 个不同大小的图标用于聚光灯 不同的 iphone 和 ipa
  • Google Analytics(分析)目标需要多长时间才能开始显示一些数据?

    我正在测试 Google Analytics 目标 但我不确定是否已正确设置它 我设定了一个基本的三步目标作为测试 然后我访问我的网站并执行这三个步骤 应该立即显示在 Google Analytics 的目标报告下还是需要几天时间 我需要知
  • 是否有调试 jQuery 事件处理程序的工具/技术?

    我目前正在尝试找出附加到我的 div 的单击事件处理程序 应该只连接一个处理程序 但似乎至少有一个 我正在使用 FireBug 但 Chrome 也可以是一个选择 我不喜欢 IE 所以我不想使用它 最好的情况是我可以使用 FireBug 检
  • 在 iOS UIWebView 中评估 JavaScript 时出现“SyntaxError: Unexpected EOF”

    当尝试将一些 JSON 传递给 a 时 我在 JavaScript 中不断收到此错误UIWebView 语法错误 意外的 EOF 没有可用的行号或文件名window onerror但我已经检查了所有引用的文件 它们都很好 我正在使用 Mon
  • 多重转变

    昨天我解决了有关 jquery 的问题 它无法正确加载 今天 我又遇到了另一个问题 一个元素的两次转换 第一个过渡在页面加载后开始 它淡入 当我不使用第二个过渡时 这个过渡实际上可以工作 每当有人将鼠标悬停在ul 问题在于悬停过渡 覆盖 淡
  • 函数指针(指向其他内核)作为 CUDA 中的内核 arg

    通过 CUDA 中的动态并行性 您可以从某个版本开始在 GPU 端启动内核 我有一个包装函数 它接受一个指向我想要使用的内核的指针 它要么在较旧设备的 CPU 上执行此操作 要么在较新设备的 GPU 上执行此操作 对于后备路径来说没问题 但
  • 使用 sed,如何匹配字符类中的方括号?

    这是原始数据的一部分 00000000 54 6f 70 69 63 20 46 6f 72 75 6d 20 52 65 70 6c Topic Forum Repl 00000010 69 65 73 20 4c 61 73 74 20
  • 如何在 Jenkins 中设置“资源根 URL”

    我们正在设置一个新的 Jenkins 实例 并发现 资源根 URL 默认为空 我已经阅读了有关此内容的 Jenkins 文档和 少数 stackoverflow 响应 但我仍然不清楚如何填写此字段 在我们的示例中 我们使用具有专用外部 IP
  • CakePHP错误数据库未定义

    我在每个问题中都搜索了这个问题的答案 但没有找到 这是我输入 localhost cakephp 时出现的错误 Notice 8 Undefined index datasource CORE Cake Model ConnectionMa
  • Django 管理模板覆盖在生产环境中不起作用

    Like 这个问题 https stackoverflow com questions 11793890 custom django admin templates not working 我的管理员覆盖在我的生产环境中不起作用 但它们在我
  • 在 SPARK 2.2.0 中如何将外部表转换为托管表?

    以下命令已成功将外部表转换为托管表Spark 2 0 0 ALTER TABLE table name SET TBLPROPERTIES EXTERNAL FLASE 但是上面的命令失败了Spark 2 2 0出现以下错误 查询错误 无法
  • 将 std::function 转换为 std::function

    首先 我定义两个类 它们相互继承 class A class B public A 然后 我声明一个使用std function