变参模板3:模式
题目描述
对于函数形参包 args
,args...
只是最简单的一种包展开形式。更通用的形式是展开模式。所谓的模式,就是指包含形参包的表达式如 args + 1
;将模式展开,就会将形参包中的每个形参,按照模式的形式展开。说起来太抽象,来看例子:
template<typename... Ts>
void foo(Ts... args) {
bar( (args + 1)... );
}
foo(1, 2, 3); // 形参包 args 的值为 1, 2, 3
这里的 (args + 1)
就是模式,后面的省略号对这个模式展开;展开的结果就如同 args_0 + 1, args_1 + 1, args_2 + 1
,也就是将每个形参都以 + 1
的形式写出。因此这里传递给函数 bar
的实参,就是 2, 3, 4
。
下面请使用模式展开编写 makeSqrtVec
函数:它将输入的形参求平方根后塞到 std::vector<double>
里面。提示:将模式展开到 std::vector{ ... }
初始化器里即可。
关于输入
无
关于输出
见样例输出
参考答案
#include <iostream>
#include <vector>
#include <cmath>
template <typename... Ts>
std::vector<double> makeSqrtVec(Ts... args) {
return {std::sqrt(args)...};
}
int main() {
for (auto i : makeSqrtVec(1, 4, 9, 16, 25)) {
std::cout << i << " ";
}
std::cout << std::endl;
for (auto i : makeSqrtVec(8, 7, 6)) {
std::cout << i << " ";
}
std::cout << std::endl;
for (auto i : makeSqrtVec()) {
std::cout << i << " ";
}
}