变参模板3:模式

题目描述

对于函数形参包 argsargs... 只是最简单的一种包展开形式。更通用的形式是展开模式。所谓的模式,就是指包含形参包的表达式如 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 << " ";
    }
}