C ++:仅限子类的模板

时间:2011-04-10 14:47:37

标签: c++ templates

有没有办法让模板只能用于基类的子类?像这样:

template<BaseClass T>
class FooBar
{
    // ...
};

3 个答案:

答案 0 :(得分:5)

使用你最喜欢的C ++库中的静态断言(例如this boost example),或者在构造函数中调用(或者在使用代码时将始终生成的其他代码)调用到无操作采用BaseClass类型的函数,例如:

template<class T>
class FooBar
{
public:
    FooBar () {
        Check(static_cast<T*>(0));
    }

private:
    void Check ( BaseClasse* ) {} 
};

(未经测试)

答案 1 :(得分:2)

不是直接的,但你可以使用Boost在构造函数中测试它:

#include <boost/type_traits/is_base_of.hpp>
#include <boost/static_assert.hpp>

template<class T>
class FooBar{
  FooBar(){
    BOOST_STATIC_ASSERT(boost::is_base_of<BaseClass,T>::value);
  }
};

或者如果你不想要一个静态断言,有时这样的事情也很好:

typedef char ERROR_T_must_be_derived_from_BaseClass[boost::is_base_of<BaseClass,T>::value ? 1 : -1];

因为编译代码的人将被带到此行并且具有“可读”错误消息。

答案 2 :(得分:0)

有一些方法可以使它与静态断言一起使用。见Boost.StaticAssert