理解可变参数模板中的类参数包

问题描述

template <typename... T>
struct Tuple { };

template<
            typename T,typename... Rest    // Template parameter pack
        >
class Tuple<T,Rest...> {      // Class parameter pack [1]
    T first;
    Tuple<Rest...> rest;        // Parameter pack expansion
    Tuple(const T& f,const Rest& ... r)
        : first(f),rest(r...) {
    }
};

我很难理解为什么我们在 class Tuple<T,Rest...> 中的类名后面有尖括号它有什么作用?我是可变参数模板的新手,我将它与简单的类模板进行对比:

template <typename T> 
class Array { 
private: 
    T *ptr; 
    int size; 
public: 
    Array(T arr[],int s) : ptr(arr),size(s) {}
    void print() {
      for (int i = 0; i < size; i++) {
          std::cout << ptr[i] << " ";
      }
    }; 
}; 

我们不需要在类声明中有尖括号的地方。我不会写,例如,

template <typename T> 
class Array<T> { 
private: 
    T *ptr; 
    int size; 
    ...

我只在初始化模板时看到类名后面的尖括号: Array<int> arr(a,2);

class Tuple<T,Rest...> 也是模板初始化吗?

参考

[1] http://www.vishalchovatiya.com/variadic-template-cpp-implementing-unsophisticated-tuple/

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)