C++中如何实现可动态切换类型的变量适配数据获取?
动态类型存储实现方案
根据你的需求,需要一个能动态存储double或string的变量,以下是两种实用的实现方式,适合非C++主语言开发者:
方法一:使用C++17标准库的std::variant(推荐)
std::variant是C++17引入的标准类型,专门用于存储多种可选类型的值,无需自定义类。核心思路是先获取字符串形式的信息,再尝试将其完整转换为double,根据转换结果决定存储类型:
#include <variant> #include <string> #include <stdexcept> // 定义可存储double或string的动态变量 std::variant<double, std::string> dynamic_value; // 1. 先获取字符串形式的信息(总能成功) std::string info_str = exampleObject.getInformation(); // 2. 尝试将字符串完整转换为double try { size_t converted_pos; // 记录转换结束的位置 double info_num = std::stod(info_str, &converted_pos); // 检查是否整个字符串都被转换(避免"123abc"这类部分有效情况) if (converted_pos == info_str.size()) { dynamic_value = info_num; // 转换成功,存double } else { dynamic_value = info_str; // 存在非数值字符,存string } } catch (const std::invalid_argument&) { // 无法转换为数值(比如纯文本),存string dynamic_value = info_str; } catch (const std::out_of_range&) { // 数值超出double范围,存string dynamic_value = info_str; } // 访问动态变量的方式 // 方式1:用std::visit匹配类型 std::visit([](auto&& val) { using T = std::decay_t<decltype(val)>; if constexpr (std::is_same_v<T, double>) { // 处理double类型逻辑 } else if constexpr (std::is_same_v<T, std::string>) { // 处理string类型逻辑 } }, dynamic_value); // 方式2:用std::get_if判断类型 if (double* num_ptr = std::get_if<double>(&dynamic_value)) { // *num_ptr 就是存储的double值 } else if (std::string* str_ptr = std::get_if<std::string>(&dynamic_value)) { // *str_ptr 就是存储的string值 }
方法二:自定义简单动态类型类(兼容C++17之前版本)
如果你的项目无法使用C++17,可以自定义一个轻量级类,手动管理类型标记和存储值:
#include <string> #include <stdexcept> class DynamicValue { private: bool is_double_type; // 标记当前存储的类型 double num_value; std::string str_value; public: // 构造函数:传入exampleObject自动判断存储类型 DynamicValue(const auto& obj) { std::string info_str = obj.getInformation(); size_t converted_pos; try { double info_num = std::stod(info_str, &converted_pos); // 确认整个字符串都被转换为数值 if (converted_pos == info_str.size()) { is_double_type = true; num_value = info_num; } else { is_double_type = false; str_value = info_str; } } catch (...) { // 任何转换失败情况都存字符串 is_double_type = false; str_value = info_str; } } // 获取类型和值的接口 bool isDouble() const { return is_double_type; } double getDouble() const { return num_value; } const std::string& getString() const { return str_value; } }; // 使用示例 DynamicValue dynamic_val(exampleObject); if (dynamic_val.isDouble()) { double num = dynamic_val.getDouble(); // 处理数值逻辑 } else { const std::string& str = dynamic_val.getString(); // 处理字符串逻辑 }
关键说明
- 为什么不直接用
double foo = exampleObject.getInformation();判断?因为原类转换失败时会返回0,无法区分“原信息就是0”和“转换失败返回0”的情况,所以先转字符串再判断更准确。 - 两种方式都优先保证只有完整可转换为数值的信息才存为
double,其余情况存string,符合你的需求。
内容的提问来源于stack exchange,提问作者blockchain187
相关产品推荐
相关产品推荐

