如何专门化类模板,以便模板参数可以是类型:指向特定类的指针或指向该特定类型的派生类的指针?是否可以在不使用Boost的情况下完成?
可能重复:C++ templates that accept only certain types
我只是想知道即使我使用指向实例的指针,答案是否相同。
答案 0 :(得分:5)
您可以将您的课程专门用于指针,然后将std::is_base_of
与static_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 action。 std::is_base_of
和static_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
似乎合适。它也有一个推动实现。