使用带检查函数的包装器替代传统方案处理可选类型是否可行?
无需附加布尔值的可选值设计思路
C++、Rust等语言提供的Option类型,本质是附带值的枚举/布尔类型,但这种方案存在以下问题:
- 返回或传递类型时需额外携带字段,产生额外开销;
- 若将函数返回值从原始类型改为可选类型,会破坏ABI兼容性。
因此,是否可以不通过附加布尔值,而是为类型关联一个检查函数来判断返回值是否有效?以下是实现思路及示例代码:
核心模板实现
template<typename T, bool(*ISOK)(T&)> struct Errorable { private: T val; public: Errorable(T v) { val = v; } bool is_ok() { return ISOK(val); } bool is_err() { return !ISOK(val); } T unwrap_or(T o) { if(ISOK(val)) return val; return o; }; T unwrap_forced() { return val; } };
包装器使用示例
bool idx_ok(int& idx) { return idx >= 0; } Errorable<int, idx_ok> array_idx_of(int *arr, int len, int elm) { for(int i = 0 ; i < len ; i++) { if(arr[i] == elm) { Errorable<int, idx_ok> ok(i); return ok; } } Errorable<int, idx_ok> err(-1); return err; }
调用示例
int main() { int arr[5] = {1, 2, 3, 4, 5}; auto idx = array_idx_of(arr, 5, 6); if(idx.is_ok()) { ... } }
注:本人是C程序员,临时使用模板编写C++代码,若有疏漏敬请谅解
内容的提问来源于stack exchange,提问作者Abdulmalek Almkainzi
相关产品推荐
相关产品推荐

