如何在C++中创建可同时存储整数与字符串的自定义数据类型sti?
在C++中实现支持整数与字符串的自定义类型
sti 当然可以实现这种同时支持整数和字符串存储的自定义类型,下面提供两种常用方案:
方案1:使用C++17标准库的std::variant(推荐)
std::variant是C++17引入的类型安全联合体,天然支持存储多种不同类型的值,是实现这类需求最简洁的方式:
#include <variant> #include <string> // 直接用std::variant定义sti类型 using sti = std::variant<int, std::string>; int main() { sti a = 10; // 存储整数 sti b = "Hello"; // 存储字符串(const char*会隐式转换为std::string) // 访问存储的值 if (std::holds_alternative<int>(a)) { int value = std::get<int>(a); } if (std::holds_alternative<std::string>(b)) { std::string str = std::get<std::string>(b); } }
std::variant会自动处理类型安全检查,避免了手动管理内存和类型标识的麻烦,还支持扩展更多存储类型。
方案2:手动实现自定义类
如果需要更定制化的行为(比如重载运算符、自定义类型转换逻辑),可以手动编写类来实现:
#include <string> #include <stdexcept> class sti { public: // 整数构造函数 sti(int value) : type_(Type::Int), int_val_(value) {} // 字符串构造函数(支持const char*和std::string) sti(const char* str) : type_(Type::String), str_val_(str) {} sti(const std::string& str) : type_(Type::String), str_val_(str) {} // 获取整数值,类型不匹配时抛出异常 int get_int() const { if (type_ != Type::Int) { throw std::runtime_error("当前存储的不是整数类型"); } return int_val_; } // 获取字符串值,类型不匹配时抛出异常 std::string get_string() const { if (type_ != Type::String) { throw std::runtime_error("当前存储的不是字符串类型"); } return str_val_; } // 判断当前存储的类型 bool is_int() const { return type_ == Type::Int; } bool is_string() const { return type_ == Type::String; } private: enum class Type { Int, String }; Type type_; int int_val_; std::string str_val_; }; int main() { sti a = 10; sti b = "Hello"; if (a.is_int()) { int val = a.get_int(); } if (b.is_string()) { std::string str = b.get_string(); } }
这种方式可以完全控制类型的行为,但需要自己处理类型安全和内存管理,适合需要高度定制的场景。
内容的提问来源于stack exchange,提问作者user17198641
相关产品推荐
相关产品推荐

