可变参数模板

声明可变参数模板的时候需要在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;