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

类能否约束模板?如何实现智能指针的反向编译约束?

实现方案

完全可以实现这个需求,借助C++20的Concepts就能精准控制模板的适用类型:

1. 定义检测Abort()方法的Concept

先写一个Concept来判断某个类型是否拥有可调用的Abort()成员函数:

#include <utility> // 用于std::declval

template<typename T>
concept HasAbort = requires {
    // 用std::declval避免创建对象实例,仅检测语法合法性
    std::declval<T>().Abort();
};

2. 给smart_ptr添加约束:禁止带Abort()的类型

让smart_ptr的模板参数必须不满足HasAbort约束,这样当传入object时就会编译失败:

template<typename T>
requires (!HasAbort<T>) // 核心约束:类型不能有Abort()
class smart_ptr {
    // 原有智能指针实现逻辑
    // 最后引用计数归零时直接delete对象
};

3. 给smart_ptr_with_abort添加约束:必须带Abort()的类型

反过来,让smart_ptr_with_abort的模板参数必须满足HasAbort约束,确保只有带Abort()的类型才能使用它:

template<typename T>
requires HasAbort<T> // 核心约束:类型必须有Abort()
class smart_ptr_with_abort {
    // 原有智能指针实现逻辑
    // 最后引用计数归零时先调用Abort(),再delete对象
};

4. 测试效果

假设你的object类定义如下:

class object {
public:
    void Abort() {
        // 必须执行的清理操作
    }
    // 其他成员定义
};

此时:

  • smart_ptr<object>会因为object满足HasAbort,违反smart_ptr的!HasAbort<T>约束,直接编译失败;
  • smart_ptr_with_abort<object>符合HasAbort<T>约束,编译正常通过。

如果object的Abort()是私有成员,只需让smart_ptr_with_abort成为object的友元即可——Concept的表达式处于未求值上下文,仅检测语法合法性,实际调用时的访问权限检查会正常生效。

内容的提问来源于stack exchange,提问作者Jonathan Potter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 05:43:22