可变参数模板
可变参数模板是指允许模板定义中包含0个到任意个模板参数。
声明
在typename和class后面加上...
template <typename ...T>
template <class ...T>
在函数模板中使用
在函数模板中,可变参数模板最常见的使用场景是:以递归的方法取出可用参数
void print() {}
template<typename T, typename... Types>
void print(const T& firstArg, const Types&... args) {
std::cout << firstArg << " " << sizeof...(args) << std::endl;
print(args...);
}
其中void print(){}
表示递归结束,就是处理最后情况,如果不写会出现编译错误
获得args的参数个数:
sizeof...(args);
在类模板中使用
template<typename ...T>
class mytuple;
//偏特化版本
template<typename HEAD, typename ...TLIST>
class mytuple<HEAD, TLIST...> : public mytuple<TLIST...>
{
public:
mytuple(HEAD head, TLIST... args) : mytuple<TLIST...>(args...), value(head){}
HEAD value;
};
//结束条件,特化版本
template<>
class mytuple<>{};
std::tuple
一个是不定长度的不同类型的集合
std::tuple<Type1,Type2,....> tuplename(Type1value,Type2value,...);
auto tuplename = std::make_tuple(value1,value2,...);
std::get<第几个Type>(tuplename) //获取tuplename中第几个参数的值。
std::bind
可以将函数(函数指针、functor、lambda)和函数所需的参数(任意个数参数)绑定为一个对象,我们在后续用到的时候可以直接调用这个对象的operator()函数即可实现对这个函数的调用。