有没有办法在现有类型上定义模板?

时间:2014-12-12 15:03:47

标签: c++ templates

我有一个类ClassType,它是其他一些类的父类。我想创建一个只能有ClassType(及其子代)类型的模板,如:

template< ClassType > class ClassABC
{
   std::shared_ptr< ClassType > m_member;
   // ...
public:
   ClassABC< ClassType >(std::shared_ptr< ClassType >& objIn) : m_member(objIn) {}
   void foo( int v1, int v2); // the function does an operation general to ClassType
}

但这不正确。有办法吗?


我希望有某种专业化:

template<> class ClassABC< B >
{
   std::shared_ptr< B > m_member;
   // ...
public:
   ClassABC< B >(std::shared_ptr< B >& objIn) : m_member(objIn) {}
   void foo( int v1, int v2); // the function does some operation specific to B
}

,对于其他类(AC),它执行泛型操作。

1 个答案:

答案 0 :(得分:3)

您可以将std::enable_ifstd::is_base_of结合使用。

例如,

#include <type_traits>      // std::is_base, std::enable_if

using std::enable_if;
using std::is_base_of;

class Base {};

template<
    class Type,
    class Enabled = typename enable_if< is_base_of<Base, Type>::value, void >::type
    >
class ClassABC
{
public:
    void foo() {}
};

class A: public Base {};
class B: public Base {};
class X {};

using At = ClassABC<A>;
using Bt = ClassABC<B>;
using Ct = ClassABC<Base>; 

using Xt = ClassABC<X>;  //! Nope.

auto main() -> int
{}