c++模版元编程-可变参数模版

在 C++ 中,我们可以使用模板参数包(Template Parameter Pack)和展开表达式(Expanding Expression)来定义可变参数模板。

模板参数包

模板参数包是一种特殊的语法,用于表示接受多个模板类型参数或非类型参数的情况。模板参数包以三个连续的点号 ... 表示,并放置在模板参数列表的末尾。

template
void myFunction(Args... args) {
    // 使用 Args... 处理参数
}

在上面的代码中,Args 是一个模板参数包,它可以表示零个或多个模板类型参数。args 是函数的参数包,在函数体内可以使用 args... 来展开参数包。

展开表达式

展开表达式是用于在编译时展开模板参数包的一种机制。我们可以使用展开表达式来逐个处理参数包中的参数。

template
void myFunction(Args... args) {
    (doSomething(args), ...);  // 使用逗号表达式展开参数包
}

在上面的代码中,(doSomething(args), ...) 这个表达式使用逗号表达式和省略号 ... 将参数包中的每个参数传递给 doSomething 函数。逗号表达式的结果是最后一个子表达式的结果,因此整个表达式的结果是最后一个 doSomething 函数的返回值。

如何使用可变参数模板?

使用可变参数模板时,我们可以根据实际需求来设计函数或类模板的接口。以下是几个示例:

可变参数函数模板

#include 

// 可变参数函数模板:求和
template
auto sum(Args... args) {
    return (args + ...);
}

int main() {
    std::cout << sum(1, 2, 3, 4, 5) << std::endl;  // 输出:15

    return 0;
}

在上面的代码中,我们定义了一个可变参数函数模板 sum,用于计算任意数量参数的和。在 main 函数中,我们调用了 sum 函数并传入了一组整数参数,然后打印求和的结果。

可变参数类模板

#include 

// 可变参数类模板:打印参数
template
class Printer {
public:
    void print(Args... args) {
        (std::cout << ... << args) << std::endl;
    }
};

int main() {
    Printer printer;
    printer.print(42, 3.14, "Hello World");  // 输出:42 3.14 Hello World

    return 0;
}

你可能感兴趣的:(c++,c++,开发语言)