首页 > 解决方案 > C++11模板:如何保证类型继承一个类?

问题描述

在Java泛型中,当我想确保某个泛型类的类型必须继承一个类时,我可以编写如下代码:

public class MyHandler<T extends Serializable> {}

这意味着T必须扩展/实现类/接口Serializable,否则编译器会产生错误。

如何在 C++11 中得到同样的东西?我的意思是,如果我将 C++11 编码如下:

template<typename T>
class MyHandler {}

在这段代码中,T可以是任何类。但是,如果我想告诉类用户T必须继承类boost::archive::text_oarchive(就像<T extends Serializable>在 Java 中一样),我该怎么办?

标签: c++c++11templates

解决方案


您可以std::is_base_of用于检查。

template<typename T>
class MyHandler {
    static_assert(std::is_base_of<boost::archive::text_oarchive, T>::value, "T must inherit boost::archive::text_oarchive");
};

由于 C++20 我们可以使用约束,例如

template<typename T> requires std::is_base_of_v<boost::archive::text_oarchive, T>
class MyHandler {};

推荐阅读