有没有办法让模板只能用于基类的子类?像这样:
template<BaseClass T>
class FooBar
{
// ...
};
答案 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