模板功能使用参数包时如何传递其他模板参数?

pet*_*555 1 c++ templates metaprogramming variadic-templates c++14

函数/类使用参数包时是否可以具有其他模板参数?

我尝试简单的求和函数。我想使用template Printer课程打印一些东西。怎么做?如何告诉编译器专门“标记”第一个参数...或有一些解决方法。

下面的代码生成错误。

#include <iostream>

template <typename T>
double sum(T t)
{
    return t;
}

template <typename Printer, typename T, typename... Rest>
double sum(Printer printer, T t, Rest... rest)
{
    printer.print();

    return t + sum(rest...);
}

struct P
{
    void print() { std::cout << "= " << std::endl; }
};

int main()
{
    P printer;
    std::cout << sum(printer, 2, 3, 4.1) << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 5

之所以会出现错误,是因为唯一sum接受多个参数的重载期望第一个参数是打印机对象。由于您只想打印一次,因此最干净的方法是将求和运算完全分成自己的函数:

template <typename T>
double sum_impl(T t)
{
    return t;
}

template <typename T, typename... Rest>
double sum_impl(T t, Rest... rest)
{
    return t + sum(rest...);
}
Run Code Online (Sandbox Code Playgroud)

然后用在 sum

template <typename Printer, typename T, typename... Rest>
double sum(Printer printer, T t, Rest... rest)
{
    printer.print();

    return sum_impl(t, rest...);
}
Run Code Online (Sandbox Code Playgroud)