如何处理向自定义容器插入无效数据类型的问题
自定义LinkedList容器类型校验问题解决
问题场景
测试自定义Linked List容器时,遇到类型校验失效的问题:
- 实例化了一个接受
uint8_t类型的容器 - 尝试插入
float类型数据,预期触发异常阻止非法插入,但实际操作成功,链表大小增加,仅存储的float节点内容无法正常打印,且异常块完全未触发
失败的尝试
- 使用
try-catch块包裹插入操作,误以为编译器会自动捕获类型不匹配的异常,实际毫无效果 - 尝试在运行时通过
typeid对比插入数据与容器的类型,结果导致合法的同类型插入也失败
最终可行方案
将append函数修改为带模板参数K的版本,利用C++17的if constexpr在编译期完成类型校验,当插入类型K与容器的模板类型T不一致时,抛出std::runtime_error:
template <typename T> class LinkedList { public: template <typename K> void append(K datum) { if constexpr (!std::is_same_v<T, K>) { throw std::runtime_error("无法向LinkedList插入与容器类型不匹配的数据"); } // 此处编写正常的节点插入逻辑 } };
这种方式既能在编译期识别类型不匹配的问题(开启足够编译警告时),也能在运行时明确抛出异常,确保只有同类型数据能被插入容器。
内容的提问来源于stack exchange,提问作者Jakob Germann
相关产品推荐
相关产品推荐

