【发布时间】:2012-08-15 02:15:48
【问题描述】:
我可以准确地指定模板可以接收什么样的参数吗?例如,我想创建一个模板,该模板只能用属于或扩展类A 的类来实例化。在 Java 中,泛型通过以下方式支持这一点:
class B<T extends A> { }
C++ 中的模板可以实现类似的功能吗?
template <typename T (?)> class B { }
【问题讨论】:
-
您可以通过
static_assert和std::is_same(对于A)和std::is_base_of(对于派生)执行此操作。我会写一个例子。我认为std::enable_if也可能会这样做,但我不能说我用过。 -
这是example。您可以更改传入的内容(
a和b有效,但c无效)。如果您没有 C++11(用于静态断言),我觉得std::enable_if可能会有所帮助,但我不确定如何使用它。它也不会提供明确的错误消息。 -
@chris,我似乎没有
type_traits头文件。我应该在哪里寻找static_assert、std::is_base_of和std::enable_if? -
没有 type_traits?这很奇怪,因为它是标准标题。它应该与所有其他人一起。
static_assert仅适用于 C++11,实际上enable_if似乎也是如此,呵呵。is_base_of也是,所以我想这需要 C++11,因为我想不出任何其他流畅的方法来做到这一点。为了使用它,您需要一个支持这些功能和-std=c++11选项的编译器。 -
@chris,我明白了...所以这是最近添加的?
标签: c++ templates generics sfinae static-assert