typename参数包和auto参数包的区别?

Difference between typename parameter pack and auto parameter pack?

假设我有这两个定义。

template<typename... Ts>
struct S{};

template<auto... Ts>
struct S{};

这两个定义有什么区别?
我们什么时候应该选择一个或另一个?

它们的用途不同,前者允许

S<int, char, float> s;

后者(仅自 C++17 起可用)允许

S<42, '*', 42U> s;

模板有3种parameters:

  1. 模板类型参数
  2. 模板非类型参数
  3. 模板模板参数
template<typename... Ts>
struct S{};

这里Ts是一组类型参数。它接受数据 types 就像 S<int, long>.

template<auto... Ts>
struct S{};

这里 Ts 是一组 非类型 参数,具有 placeholder 类型。它像 S<12, 34L>.

一样接受 values

auto 允许混合不同类型的值。

template<int... Ts>
struct S{};

这个类似,但是所有的值都是固定类型int