如何使用特征对象来引用具有泛型方法的结构

2023-11-30

关于这个问题,将闭包存储在 HashMap 中,我了解到正确地将闭包传递给函数需要该函数是通用的,并且采用任何实现 Fn、FnMut 或 FnOnce 特征的类型。

在实现 C++ 库的一部分作为学习练习时,我需要某种类似这样的类型抽象。

use std::collections::HashMap;

struct Event;

trait IObject {
    fn makeFunc<F : FnMut(&Event)>(&mut self, s : &str, f : F);
}

struct Object1<'a> {
    m_funcs : HashMap<String, Box<FnMut(&Event) + 'a>>
}

impl <'a> Object1<'a> {
    fn new() -> Object1<'a> {
        Object1 {m_funcs : HashMap::new()}
    }
}

impl <'a> IObject for Object1<'a> {
    fn makeFunc<F : FnMut(&Event) + 'a>(&mut self, s: &str, f: F) {
        self.m_funcs.insert(String::from_str(s), Box::new(f));
    }
}

fn main() {
    let obj : &IObject = &Object1::new();
    println!("Hello, world!");
}

但是,返回的错误表明 IObject 不能是特征对象,因为它包含具有通用参数的方法。然而,为了将闭包传递给函数,我需要泛型。有人可以告诉我如何实现我正在寻找的抽象,同时仍然能够将闭包传递给函数吗?


你无法回避这个问题;静态和动态调度不能混合。静态分派(泛型)所做的单态化根本无法与动态分派(特征对象)中使用的 vtable 一起使用。

两者之一必须去掉:要么使用IObject作为特征对象或通用函数参数,有利于接受Box<FnMut(&Event) + 'a>.

顺便说一下,请注意你的IObject实现与特征不匹配——特征没有给出生命周期限制F,您的实现的位置。你需要添加'a无论如何,作为特征定义的通用(通用寿命对特质对象没问题)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用特征对象来引用具有泛型方法的结构 的相关文章

随机推荐

  • 用mockito测试Riverpod的正确方法是什么

    用mockito测试Riverpod的正确方法是什么 运行上面的代码 edited snippets from production side not important skip to the TEST below this seems
  • iOS 中如何强制视图进入横向?

    我在 SO 上看到了十几个可能的相关问题 但似乎没有一个是重复的 如何在viewdidload中强制视图旋转为横向 强制横向 ios 7 IOS 如何强制视图为横向 强制横向一个视图控制器 ios iOS 强制横向方向 如何使应用程序在 i
  • AOSP 非显而易见的 syscall() 实现

    据我所知 Linux ABI for ARM 声明系统调用返回值是通过r0如果它是负数 则应将其作为 errno 值取反进行线程化 即系统调用最终出现了一些错误 AOSP这个检查吗以某种奇特的方式 ENTRY syscall mov ip
  • Excel公式加1

    我正在尝试复制并粘贴一些保持格式的单元格 并将它们链接到表格 目前我有一张桌子 但我从另一张纸上引用它 例如 Sheet2 A1 Sheet2 B1 Sheet2 C1 Sheet2 D1 Sheet2 E1 我试图一次将其复制 4 行并粘
  • 域名正则表达式

    尝试从 URL 中提取域名 例如 x lt https stackoverflow com questions ask to stackoverflow com 我从这个问题中找到了以下正则表达式 正则表达式匹配主域名 regex lt 0
  • 逻辑或条件

    在 grails gsp 中 而不是
  • 在 R 启动时运行 R 脚本

    我只想运行 R 脚本example r当我启动 R 时自动 我在用R version 3 2 3 on centOS 我搜索了这个 但我无法弄清楚 R的启动行为可以通过编辑来修改Rprofile site 可能需要创建它 因为默认的 R 安
  • 安装mysqldb python界面时找不到mysql_config

    我正在尝试让 Python 脚本在我通过 ssh 连接的 Linux 服务器上运行 该脚本使用 mysqldb 我拥有我需要的所有其他组件 但是当我尝试通过 setuptools 安装 mySQLdb 时 如下所示 python setup
  • JQuery,从 DOM 元素获取所有数据属性

    我有一个具有多个数据属性的选择
  • pyspark:groupby 和聚合 avg 和多列上的第一个

    我有一个以下示例 pyspark 数据帧 在 groupby 之后我想计算平均值 以及多列中的第一个 在实际情况下 我有 100 列 所以我无法单独执行此操作 sp spark createDataFrame a 2 4 cc anc a
  • 无法获取 gemfile 以允许捆绑包更新

    我是红宝石 Rails 新手 这是我的宝石文件 source https rubygems org ruby 2 0 0 ruby gemset railstutorial rails 4 0 gem rails 4 0 0 group d
  • Qt 拖放到 Windows 资源管理器:如何知道拖放的目标路径

    我想做的是显示在线文件的列表视图 就像 FTP 客户端列出 FTP 服务器上的所有文件一样 并且可以将任意行或多行拖动到任何本地文件夹以将拖动的文件保存在那里 我计划通过以下步骤来实现这一点 初始化拖动事件 并将所选文件的路径保存在服务器上
  • 508的http响应状态是什么?

    在我的网站上 加载图像 视频时 有时我会在控制台中收到如下错误 Failed to load resource the server responded with a status of 508 Loop Detected 这是什么意思以及
  • 空值被添加到所有 mysql 行,而不仅仅是目标行

    将数据提交到我的服务器后 空列将被添加到我的 MySQL 行中 我将其输入一行 但所有行至少有一个空列 我怎样才能防止这种情况发生 这是一个例子 任何 0 字节都是空行 到目前为止我的 PHP 代码 当我弄清楚这部分时将会更改
  • 迭代 TreeView 节点

    我使用此代码来迭代所有 TreeView 节点 for TreeItem
  • Python 子进程 .check_call 与 .check_output

    我的 python 脚本 python 3 4 3 通过子进程调用 bash 脚本 import subprocess as sp res sp check output bashscript shell True The bash脚本包含
  • excel vba - 检查单选按钮是否被选中?

    我正在尝试检查这些简单单选按钮组的值 但我的语法已关闭 有人知道要更改什么吗 注意 它们是 Excel 选项按钮而不是 ActiveX 按钮 并且不在用户窗体上 If Worksheets Input Shapes Option Butto
  • 如何在异步任务中拥有舒适的(例如 GNU-readline 样式)输入行?

    我有一个异步程序 有两个任务 任务 1 做了一些工作 任务2提供命令行界面 CLI 它读取用户的命令并将其发送给任务1进行处理 CLI 基本上是一个循环 从连接到标准输入的异步流中读取行 它可以工作 但不是很舒服 问题是输入行不提供除 BA
  • GTSummary 中的行分组

    我正在尝试对一些行 变量 分类变量和连续变量 进行分组 以帮助提高大型数据集中的表可读性 这是虚拟数据集 library gtsummary library tidyverse library gt set seed 11012021 Cr
  • 如何使用特征对象来引用具有泛型方法的结构

    关于这个问题 将闭包存储在 HashMap 中 我了解到正确地将闭包传递给函数需要该函数是通用的 并且采用任何实现 Fn FnMut 或 FnOnce 特征的类型 在实现 C 库的一部分作为学习练习时 我需要某种类似这样的类型抽象 use