可变参数模板
声明可变参数模板的时候需要在typename或class 后面带上省略号...
- 声明一个参数包,这个参数包中可以包含0到任意个板参数。
- 在模板定义的右边,可以将参数包展开成一个一个独立的参数。
template<typename... T>
void f(T... args)
{
coout << sizeof...(args) <<endl;
}
f();
f(1,2);
f(1,2,"");
ZLMediaKit的模板
template<typename Creator,
typename HttpSessionType = mediakit::HttpSession,
mediakit::WebSocketHeader::Type DataType = mediakit::WebSocketHeader::TEXT>
class WebSocketSessionBase : public HttpSessionType {
void onError(const toolkit::SockException &err) override{
HttpSessionType::onError(err);//明确告诉编译器,这个 onError 是从当前模板参数基类 HttpSessionType 里找
if(_session){
_session->onError(err);
}
}
};
- 类型模板参数:Createor
- 类型模板参数:HttpSessionType ,且有默认值,如果外面不传参数,就默认用mediakit::HttpSession
- 非类型模板参数:mediakit::WebSocketHeader::Type DataType
class WebSocketSessionBase : public HttpSessionType 的语法含义是“继承一个由模板参数决定的基类”。 这叫 依赖基类,因为基类类型依赖于模板参数,只有将来实例化时才知道到底继承谁。
这个onError()函数,编译器不会在第一阶段普通名字查找里直接去基类里找,除非你写成this->onError(err);或者HttpSessionType::onError(err);
这里的HttpSessionType::onError是明确告诉编译器,这个 onError 是从当前模板参数基类 HttpSessionType 里找
模板元编程
模板变量的定义
std::enable_if
std::enable_if<条件,类型>::type;
当条件为 true 时:
std::enable_if<true,类型>::type 其中的type存在,并且就是第二个模板参数指定的类型。
例如:
std::enable_if<true, bool>::type //条件为true,等价于 bool
std::enable_if<false, int>::type//条件为false,其中不存在type
std::is_same
两个模板参数类型参数是否一致,一致的话返回true。
例如:
std::is_same<bool, bool>::value //结果为true;
std::is_same<int, bool>::value //结果为false;