可变参数模板的需求
可变参数模板有助于解决在编译时求值类型安全,不需要宏,不需要显式指定 参数的数量,可以编写可变参数函数模板和可变参数类模板。此外,也有可变参数变量模板和可变 参数别名模板。
可变参数函数模板
可变参数模板以两种方式使用省略号。在参数名称的左侧,表示参数包,在参数名称的右侧,将参数包扩展为单独的名称。
1 | template <typename T> |
- 要在模板参数列表中指定一组参数,如
typename... Args
,这称为模板参数包。可以为类型模板、非类型模板和双重模板参数定义的模板参数包。 - 函数参数列表中指定一组参数,如
Args...args
,这称为函数参数包。 - 函数体中展开包,如在
args...
中,可在min(args...)
中看到,这称为参数包展开。这种展开的结果是一个由零个或多个值 (或表达式) 组成的逗号分隔列表。
参数包
sizeof...
计算参数包的大小,返回std::size_t
类型的constexpr
值。
可变参数类模板
折叠表达式
折叠方式 | 语法 | 展开方式 |
---|---|---|
一元右折叠 | (pack op …) | (arg1 op (… op (argN-1 op argN))) |
一元左折叠 | (… op pack) | (((arg1 op arg2) op …) op argN) |
二元右折叠 | (pack op … op init) | (arg1 op (… op (argN-1 op (argN op init)))) |
二元左折叠 | (init op … op pack) | ((((init op arg1) op arg2) op …) op argN) |
一元折叠中,若参数包不包含任何元素,则只允许使用某些操作符。下表列出了这些值,以及 空参数包的值:
操作符 空参数包的值 && (逻辑 AND) true || (逻辑 OR) false , (逗号操作符) void()