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

如何禁止C++模板类将自身实例作为模板参数?

限制C++类模板参数不能是自身实例的实现方法

可以通过两种主流方式实现这个需求,分别适配不同的C++标准版本:

方法一:C++11及以上用SFINAE机制

先定义一个类型特征,用来识别Foo的实例类型:

#include <type_traits>

// 默认情况下,任意类型都不是Foo的实例
template<class T>
struct is_Foo : std::false_type {};

// 特化:当T是Foo<U>时,标记为true
template<class U>
struct is_Foo<Foo<U>> : std::true_type {};

接着修改Foo的模板定义,用std::enable_if添加约束,仅当参数T不是Foo实例时才启用模板:

// 第二个模板参数用enable_if过滤掉Foo实例类型
template<class T, class = std::enable_if_t<!is_Foo<T>::value>>
class Foo{};

方法二:C++20及以上用Concepts(更简洁)

基于上面的is_Foo类型特征,定义一个Concept来约束参数:

#include <concepts>

template<class T>
concept NotFoo = !is_Foo<T>::value;

然后直接用这个Concept修饰Foo的模板参数:

template<NotFoo T>
class Foo{};

测试效果

以下代码中,合法的实例能正常编译,非法的嵌套实例会触发编译错误:

struct Bar{};

Foo<Bar> valid_obj; // 编译通过
Foo<Foo<Bar>> invalid_obj; // 编译失败,符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:02:02