如何使用boost::blank为int、double设置空值并判断空状态
boost::blank 用法与可空数值实现示例
boost::blank本身是一个无状态的空标签类型,不能直接给原生int、double附加空状态,需要搭配boost::variant组成联合类型,才能实现「值为空/持有具体数值」两种状态的切换。
前置依赖
使用时需要引入的头文件:
#include <boost/variant.hpp> #include <boost/blank.hpp> #include <iostream>
可空数值的定义与基础操作示例
int main() { // 定义可空int、可空double类型 using NullableInt = boost::variant<boost::blank, int>; using NullableDouble = boost::variant<boost::blank, double>; // 1. 初始化空值:默认构造的variant默认持有boost::blank,代表空状态 NullableInt num1; NullableDouble score1; // 2. 判断是否为空 if (boost::get<boost::blank>(&num1)) { std::cout << "num1当前是空值" << std::endl; } if (boost::get<boost::blank>(&score1)) { std::cout << "score1当前是空值" << std::endl; } // 3. 赋值为具体数值 num1 = 1024; score1 = 99.5; // 4. 赋值后再次判空、取值 if (!boost::get<boost::blank>(&num1)) { // 非空时可以安全取具体值 std::cout << "num1的具体值为:" << boost::get<int>(num1) << std::endl; } if (!boost::get<boost::blank>(&score1)) { std::cout << "score1的具体值为:" << boost::get<double>(score1) << std::endl; } // 5. 重新设置为空值 num1 = boost::blank(); if (boost::get<boost::blank>(&num1)) { std::cout << "num1已被重置为空值" << std::endl; } return 0; }
运行输出结果
num1当前是空值 score1当前是空值 num1的具体值为:1024 score1的具体值为:99.5 num1已被重置为空值
注意事项
- 取值前必须先做判空校验,直接调用
boost::get<int>(空状态的variant)会抛出boost::bad_get异常 - 如果使用C++17及以上版本,也可以用标准库的
std::variant+ 自定义空标签类实现完全相同的效果,逻辑和上述示例一致
内容的提问来源于stack exchange,提问作者Meng
相关产品推荐
相关产品推荐

