如何禁止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
相关产品推荐
相关产品推荐

