基于C++语言现有的数据类型,设计一种数据结构,可以达到一个效果,这个效果就是:我调用“多个不同的接口”的返回值,我都可以使用这个数据结构装载数据,但是当我返回其中一种数据类型时,另外没有返回数据的,尽量少占用内存。
如:我定义一个结构体,结构体本身也是一种数据类型,但是个结构体能满足调多不同的现在过,以后的接口的参数返回,
如:我不管调用哪个接口,都返回一个Map,
(可能有的同学已经明白了,这个就是门面模式中统一入口,但我要兼容放回值)
基于C++语言现有的数据类型,设计 一种数据结构
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥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批量调动