C++11变参模板

变参模板是C++11中新的特性,它主要解决了原有模板参数数量不可变的问题。现在标准库的tuple实现就是基于变参模板来实现的。

还是从C的变参函数来说吧,经典的就是printf了, 它基于可变参数

void print(const char *fmt, ...)
{
    va_list ls;
    va_start(fmt, ls);
    va_arg(ls, int);
    va_end(ls);
}

我们需要知道变参的类型才能够从列表中取出参数,为此之后就有变参宏

#define PRINT(ch, args...) printf(ch, ##args)
或者(C99)
#define PRINT(ch, ...) printf(ch, ##__VA_ARGS__ )

后来有了模板,可以接受任意类型,如果想接收多个不同的类型参数就要需要包装器来传递,于是有了pair有了tuple。

template
void print(T t)
{
}
template<>
void print(std::tuple t)
{
}

这不是理想状态,我们需要接受不定参数的模板的支持,于是乎等的望眼欲穿他终于来了。使用变参模板时,会需要递归来支持,并且需要一个结束函数来处理最后的结果。

template
void print(T t, L... l)
{
    /*可以添加检查
      if ( sizeof...(t) < 1) {
           std::cout << "end" << std::endl;
      }
       */
     print(t, l); //这里是递归调用
}
template
void print(T t)
{
    std::cout <<  "end" << std::endl;
}
...其实也是一个包装器,不过他通过编译器来展开,而不是在运行时来操作,性能自然会好很多。

你可能感兴趣的:(C++)