【问题标题】:Specializing a template class to take a pointer to a particular class or a pointer to a derived class object特化模板类以获取指向特定类的指针或指向派生类对象的指针
【发布时间】:2013-02-04 09:29:26
【问题描述】:

如何专门化一个类模板,以便模板参数可以是类型:指向特定类的指针或指向该特定类型的派生类的指针?不使用Boost可以做到吗?

可能重复:C++ templates that accept only certain types

我只是想知道答案是否相同,即使我使用的是指向实例的指针。

【问题讨论】:

  • 是的,您可以使用标准库和 c++ 功能
  • @BЈовић 到目前为止我所看到的模板专业化只专注于指向类型的指针。像模板 类 Class_Name。我怎么能说 T 必须是特定的用户定义类型?

标签: c++ templates template-specialization


【解决方案1】:

您可以将您的类专门用于指针,然后使用 std::is_base_ofstatic_assert

template <typename T>
class foo;

template <typename T>
class foo<T*>
{
  static_assert(std::is_base_of<Base, T>::value, "Type is not a pointer to type derived from Base");
};

See it in actionstd::is_base_ofstatic_assert 都是 C++11 特性,因此不需要 Boost。

如果由于某种原因你不喜欢static_assert,你可以使用enable_if 方式:

template <typename T, typename Enable = void>
class foo;

template <typename T>
class foo<T*, typename std::enable_if<is_base_of<Base, T>::value>::type>
{
  // ...
};

【讨论】:

  • 感谢您的信息。我还有一个疑问:是语句: typename std::enable_if<:is_base_of>::value >::type* = 0 仅用于断言吗?
  • @sajas enable_if 使用语言的奇特特性来对某些事物强制执行断言式约束。它可用于在某些条件下启用不同的构造。您刚刚给出的示例是用于启用函数模板,您提供一个类型为 std::enable_if&lt;...&gt;::type* 默认为 0 的虚拟参数。我给出的示例是用于启用类专业化,您在其中提供一个类似的虚拟模板参数默认为void的方式。
  • @sajas enable_if 在条件为假时导致无效的模板实例化。特别是,如果条件为假,则不会定义其成员type
【解决方案2】:

一种基于某些谓词而不是模式的特化技术是使用额外的默认参数。

template <typename T, bool = predicate<T>::value>
class foo {
    // here is the primary template
};

template <typename T>
class foo<T, true>  {
    // here is the specialization for when the predicate is true
};

您所需要的只是一个正确的谓词。在这种情况下,std::is_base_of 似乎很合适。它也有一个 boost 实现。

【讨论】:

  • 感谢您的信息。我还有一个疑问:是语句: typename std::enable_if<:is_base_of>::value >::type* = 0 仅用于断言吗?
  • @sehe 实际上,我只是想让他们中的任何一个回答这个问题。这两个答案对我来说似乎都是正确的。
  • @sajas 感谢您的坦率解释。请注意,SO 上的大多数回答者都没有很好地接受这一点。它被认为是不礼貌的。如果您还有其他一般性问题(像这样),请搜索 SO 并在找不到时选择提出新问题。
  • @sehe 很抱歉。我应该删除评论吗?
猜你喜欢
  • 2016-12-02
  • 2014-06-16
  • 2021-05-20
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多