如何对template参数加一些限制?
比如:
- C/C++ code
class Managed;template<typename T> class Manager;
我想要求T必须是Managed的子类,如何做到?
[解决办法]
仅通过template<typename T> class Manager { }这样的定义是无法进行限制的。
可以这样做,使用T之前先判断一下T与Manager之间的关系到底是不是父子关系
- C/C++ code
if (dynamic_cast<T*>(reinterpret_cast<Manager*>(0))){ Manager<T> mgr; // T一定为Manager的之类}
[解决办法]
BOOST_MPL_ASSERT_MSG(boost::is_base_of<Managed, T>::value, ...
或者你也可以直接在模版函数里把参数 T* 转型为 Managed*, 如果 T 是 Managed 的子类, 编译通过, 一切正常. 如果不是, 产生编译错误. 只是错误的消息不是那么直观
[解决办法]
[解决办法]
楼主要是能用 c++11 的功能,下面这样就简单。
- C/C++ code
#include <type_traits>class Managed;template<typename T>class Manager{ static_assert(std::is_base_of<Managed,T>::value,"");};class Managed { };class derived : public Managed { };class nonderived { };int main (){ Manager<derived> t; Manager<nonderived> tt; // error : static_assert failed return 0;}