You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用带检查函数的包装器替代传统方案处理可选类型是否可行?

无需附加布尔值的可选值设计思路

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 09:42:41