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:
- 模板类型参数
- 模板非类型参数
- 模板模板参数
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
。
假设我有这两个定义。
template<typename... Ts>
struct S{};
template<auto... Ts>
struct S{};
这两个定义有什么区别?
我们什么时候应该选择一个或另一个?
它们的用途不同,前者允许
S<int, char, float> s;
后者(仅自 C++17 起可用)允许
S<42, '*', 42U> s;
模板有3种parameters:
- 模板类型参数
- 模板非类型参数
- 模板模板参数
template<typename... Ts>
struct S{};
这里Ts
是一组类型参数。它接受数据 types 就像 S<int, long>
.
template<auto... Ts>
struct S{};
这里 Ts
是一组 非类型 参数,具有 placeholder 类型。它像 S<12, 34L>
.
auto
允许混合不同类型的值。
template<int... Ts>
struct S{};
这个类似,但是所有的值都是固定类型int
。