检查模板参数是否从类继承

Okt*_*rom 11 c++ templates

我想检查给予模板的类型是否继承自项目中的基类.

它应该像以下示例中所期望的那样工作:

template< class T : public CBaseClass >
Run Code Online (Sandbox Code Playgroud)
  • 是否可以使用模板执行此操作,如果没有,我还能怎么做?

Fre*_*urk 14

以下Stroustrup的一个例子:

template<class Test, class Base>
struct AssertSameOrDerivedFrom {
  AssertSameOrDerivedFrom() { &constraints; }
public:
  static void constraints() {
    Test *pd = 0;
    Base *pb = pd;
  }
};

template<class T>
struct YourClass {
  YourClass() {
    AssertSameOrDerivedFrom<T, CBaseClass>();
  }
};
Run Code Online (Sandbox Code Playgroud)

在C++ 0x中,这变为:

template<class T>
struct YourClass {
  static_assert(std::is_base_of<CBaseClass, T>::value);
};
Run Code Online (Sandbox Code Playgroud)


Jer*_*ock 12

你可以使用boost::is_base_and_derivedBoost,结合使用BOOST_STATIC_ASSERT.如果您使用的是支持TR1或C++ 0x的编译器,那么标准库中的这些构造就等价(std :: is_base_of,C++ 0x中的static_assert语句).

  • 看看你是否有 `&lt;type_traits&gt;` 头文件和里面的 `std::is_base_of` 模板。 (2认同)

Edw*_*nge 6

如果你想断言,那就去做Nurk吧.如果要检查,请使用boost或C++ 0x中的is_base_of.如果您不能使用其中任何一种,请使用SFINAE:

template < typename Base, typename PotentialDerived >
struct is_base
{
  typedef char (&no)  [1];
  typedef char (&yes) [2];

  static yes check(Base*);
  static no  check(...);

  enum { value = sizeof(check(static_cast<PotentialDerived*>(0))) == sizeof(yes) };
};
Run Code Online (Sandbox Code Playgroud)