li-heng 2023-03-24 20:16 采纳率: 81.5%
浏览 54
已结题

基于C++语言现有的数据类型,设计 一种数据结构

基于C++语言现有的数据类型,设计一种数据结构,可以达到一个效果,这个效果就是:我调用“多个不同的接口”的返回值,我都可以使用这个数据结构装载数据,但是当我返回其中一种数据类型时,另外没有返回数据的,尽量少占用内存。
如:我定义一个结构体,结构体本身也是一种数据类型,但是个结构体能满足调多不同的现在过,以后的接口的参数返回,
如:我不管调用哪个接口,都返回一个Map,
(可能有的同学已经明白了,这个就是门面模式中统一入口,但我要兼容放回值)

  • 写回答

3条回答 默认 最新

  • 「已注销」 2023-03-24 20:25
    关注

    参考GPT:可以设计一个模板类,模板参数为可变参数模板(variadic templates),用来装载多种不同类型的数据。具体实现可以使用C++17的std::variant和std::optional库来实现。

    代码示例:

    #include <variant>
    #include <optional>
    #include <map>
    
    template<typename... Args>
    class MultiReturnData {
    public:
        using VariantType = std::variant<std::optional<Args>...>;
    
        // 支持多种类型作为参数,构造函数初始化变量值为空
        MultiReturnData() : mData(std::nullopt) {}
    
        // 可以使用多种类型的返回值来装载数据
        template<typename T>
        void setData(T&& data) {
            mData.template emplace<std::optional<T>>(std::forward<T>(data));
        }
    
        // 获取数据,如果没有相应类型的数据,则返回std::nullopt
        template<typename T>
        std::optional<T> getData() const {
            std::optional<T> ret;
            std::visit([&ret](auto&& arg) {
                using TArg = std::decay_t<decltype(arg)>;
                if constexpr(std::is_same_v<TArg, std::optional<T>>) {
                    ret = arg;
                }
            }, mData);
            return ret;
        }
    
        // 如果存在相应类型的数据,则返回true
        template<typename T>
        bool hasData() const {
            bool ret = false;
            std::visit([&ret](auto&& arg) {
                using TArg = std::decay_t<decltype(arg)>;
                if constexpr(std::is_same_v<TArg, std::optional<T>>) {
                    ret = arg.has_value();
                }
            }, mData);
            return ret;
        }
    
        // 如果没有任何数据,则返回true
        bool empty() const {
            bool ret = true;
            std::visit([&ret](auto&& arg) {
                using TArg = std::decay_t<decltype(arg)>;
                if constexpr(std::disjunction_v<std::is_same<TArg, std::optional<Args>>...>) {
                    ret = std::none_of(arg, [](auto&& opt) { return opt.has_value(); });
                }
            }, mData);
            return ret;
        }
    
        // 清除所有数据
        void clear() {
            mData = std::nullopt;
        }
    
        // 将数据转换成std::map类型
        std::map<std::string, VariantType> toMap() const {
            return {{"data", mData}};
        }
    
    private:
        VariantType mData;
    };
    

    该模板类支持传入多种数据类型,使用std::optional包裹每种类型的数据,如果该类型的数据没有返回,则std::optional为空。同时,该模板类支持通过调用getData函数获取指定类型的数据,支持调用hasData函数判断指定类型的数据是否存在,支持调用toMap函数将数据转换成std::map类型。

    使用示例:

    #include <iostream>
    
    int main() {
        MultiReturnData<int, float, std::string> data;
        data.setData<int>(10);
        data.setData<std::string>("hello world");
    
        if (data.hasData<int>()) {
            std::cout << "data int value: " << data.getData<int>().value() << std::endl;
        }
    
        if (data.hasData<float>()) {
            std::cout << "data float value: " << data.getData<float>().value() << std::endl;
        }
    
       
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月1日
  • 已采纳回答 3月24日
  • 创建了问题 3月24日

悬赏问题

  • ¥15 网络科学导论,网络控制
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)