如何检测存储boost::variant指针的向量内部的空指针
检测boost::variant存储指针是否为空的实现方案
首先需要指出你当前示例代码的误区:你代码中的A<int>* tst从未被存入std::vector<registry> v,因此你将tst置空的操作完全不会影响向量内的元素,自然不会触发你期望的错误提示。如果要测试空指针场景,需要将空指针存入variant后再放入向量,比如执行v.push_back(static_cast<A<int>*>(nullptr));。
具体的空指针检测有两种常用实现方式:
方式1:在原有业务访问器中增加空指针校验
直接修改你的myVisitor,在调用指针指向的成员函数前先判空,空指针时抛出异常或输出错误提示即可:
class myVisitor : public boost::static_visitor<> { public: template<typename T> void operator() (A<T>* a) const { // 新增空指针校验逻辑 if (!a) { // 可自定义错误处理,比如抛出异常、输出错误日志 throw std::runtime_error("访问到空指针类型的variant条目"); } a->write(); } };
该方式适合在执行业务逻辑的同时完成校验,调用boost::apply_visitor时只要variant存储的是空指针就会触发你要的错误提示。
方式2:实现独立的空指针检测访问器
如果你需要单独判断某个variant条目是否为空,不需要执行业务逻辑,可以专门写一个返回布尔值的访问器:
class NullCheckVisitor : public boost::static_visitor<bool> { public: template<typename T> bool operator() (const T* ptr) const { return ptr == nullptr; } };
使用时调用bool isNull = boost::apply_visitor(NullCheckVisitor(), x);即可,返回值为true就说明当前variant存储的是空指针。
内容的提问来源于stack exchange,提问作者user8458838
相关产品推荐
相关产品推荐

