You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将接收MyHandle的std::function适配为uint32_t参数并存入容器

解决方案

你的核心问题是函数签名不匹配:容器mFunctions存储的是接受uint32_t参数的函数对象,但公开API接收的是接受MyHandle参数的函数对象,两者属于不同类型,无法直接存入容器。需要通过适配器函数(lambda)完成参数类型转换,具体实现如下:

修正枚举定义(语法错误)

首先修正枚举类的语法错误,移除末尾多余的分号:

enum class MyHandle : uint32_t { Null = 0 };

实现适配的addFunction

修改addFunction函数,用lambda包装传入的函数,将uint32_t参数转换为MyHandle后调用原函数:

#include <vector>
#include <functional>
#include <cstdint>

enum class MyHandle : uint32_t { Null = 0 };

class YourClass {
private:
    std::vector<std::function<void(uint32_t)>> mFunctions;

public:
    void addFunction(std::function<void(MyHandle)>&& fn) {
        // lambda作为适配器:接收uint32_t,转换为MyHandle后调用原函数
        mFunctions.push_back([fn = std::move(fn)](uint32_t val) {
            fn(static_cast<MyHandle>(val));
        });
    }
};

关键细节说明

  • 类型适配逻辑:lambda的签名为void(uint32_t),与容器存储的函数类型完全匹配。当lambda被调用时,会将传入的uint32_t值通过static_cast转换为MyHandle类型,再转发给原函数执行。
  • 移动语义优化:捕获时使用std::move(fn)转移原函数对象的所有权,避免不必要的拷贝操作,提升性能。
  • 转换安全性:MyHandle是基于uint32_t的强类型枚举,static_cast属于类型安全的转换方式,不会出现数据丢失或类型错误问题。

内容的提问来源于stack exchange,提问作者Gasim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:32:18