专门用于获取指向特定类或指向派生类对象的指针的模板类

时间:2013-02-04 09:29:27

标签: c++ templates template-specialization

如何专门化类模板,以便模板参数可以是类型:指向特定类的指针或指向该特定类型的派生类的指针?是否可以在不使用Boost的情况下完成?

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

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

2 个答案:

答案 0 :(得分:5)

您可以将您的课程专门用于指针,然后将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>
{
  // ...
};

答案 1 :(得分:1)

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

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似乎合适。它也有一个推动实现。