如何在C++中实现C#泛型类的基类类型约束效果
我有如下一段C#代码:
class Foo<T> where T : TClass { // body }请问在C++中是否有标准方法,可以实现上述代码中的泛型类型约束效果?
C++实现对应泛型约束的标准方案
有标准实现方法,不同C++标准版本对应不同的写法,效果和C#的泛型约束完全一致:
C++20及更高版本(最推荐)
C++20新增的*概念(Concept)*特性可以实现和C#语法接近、可读性极高的约束效果:
#include <concepts> // 写法1:约束写在requires子句中 template<typename T> requires std::derived_from<T, TClass> class Foo { // body }; // 写法2:约束直接声明在模板参数位置,更简洁 template<std::derived_from<TClass> T> class Foo { // body };
当传入的T不是TClass或其公有派生类时,编译期会直接输出清晰的错误提示,使用体验和C#的泛型约束一致。
C11 ~ C17版本
旧标准可以通过类型萃取+SFINAE或者静态断言实现同等效果:
方法1:std::enable_if实现SFINAE约束
#include <type_traits> template<typename T, typename = typename std::enable_if<std::is_base_of<TClass, T>::value>::type> class Foo { // body };
不满足约束的T会直接匹配不到对应的模板类,触发编译错误。
方法2:静态断言(错误提示更清晰)
#include <type_traits> template<typename T> class Foo { static_assert(std::is_base_of<TClass, T>::value, "泛型参数T必须是TClass或其派生类"); // body };
静态断言可以自定义错误提示,排查问题更方便,是旧标准下更推荐的写法。
注意以上所有std::is_base_of、std::derived_from的默认行为都和C#的where T : TClass完全匹配,认可TClass本身以及所有公有继承自TClass的子类,常规场景下直接使用即可。
内容的提问来源于stack exchange,提问作者Hung Quang
相关产品推荐
相关产品推荐

