我有一个类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
}
,对于其他类(A
和C
),它执行泛型操作。
答案 0 :(得分:3)
您可以将std::enable_if
与std::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
{}