类能否约束模板?如何实现智能指针的反向编译约束?
实现方案
完全可以实现这个需求,借助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
相关产品推荐
相关产品推荐

