0%

可变参数模板

可变参数模板的需求

可变参数模板有助于解决在编译时求值类型安全,不需要宏,不需要显式指定 参数的数量,可以编写可变参数函数模板和可变参数类模板。此外,也有可变参数变量模板和可变 参数别名模板。

可变参数函数模板

可变参数模板以两种方式使用省略号。在参数名称的左侧,表示参数包,在参数名称的右侧,将参数包扩展为单独的名称。

1
2
3
4
5
6
7
8
9
10
template <typename T> 
T min(T a, T b)
{
return a < b ? a : b;
}
template <typename T, typename... Args>
T min(T a, Args... args)
{
return min(a, min(args...));
}
  • 要在模板参数列表中指定一组参数,如 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()

可变参数别名模板

可变参数变量模板