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日

悬赏问题

  • ¥50 关于#html5#的问题:H5页面用户手机返回的时候跳转到指定页面例如(语言-javascript)
  • ¥15 无法使用此凭据登录,因为你的域不可用,如何解决?(标签-Windows)
  • ¥15 yolov9的训练时间
  • ¥15 二叉树遍历没有报错但无法正常运行
  • ¥15 在linux系统下vscode运行robocup3d上场球员报错
  • ¥15 Python语言实验
  • ¥15 SAP HANA SQL 增加合计行
  • ¥20 用C#语言解决一个英文打字练习器,有偿
  • ¥15 srs-sip外部服务 webrtc支持H265格式
  • ¥15 在使用abaqus软件中,继承到assembly里的surfaces怎么使用python批量调动