模板函数使用参数包时如何传递其他模板参数?
How to pass other template parameter when template function uses parameter pack?
function/class使用参数包时是否可以有其他模板参数?
我尝试简单的求和函数。我想使用 template Printer
class 打印一些东西。怎么做?如何告诉编译器特别 "mark" 第一个参数...或者有一些解决方法。
下面的代码会产生错误。
#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;
}
您收到一个错误,因为接受多个参数的唯一 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...);
}
然后在 sum
中使用它
template <typename Printer, typename T, typename... Rest>
double sum(Printer printer, T t, Rest... rest)
{
printer.print();
return sum_impl(t, rest...);
}
function/class使用参数包时是否可以有其他模板参数?
我尝试简单的求和函数。我想使用 template Printer
class 打印一些东西。怎么做?如何告诉编译器特别 "mark" 第一个参数...或者有一些解决方法。
下面的代码会产生错误。
#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;
}
您收到一个错误,因为接受多个参数的唯一 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...);
}
然后在 sum
template <typename Printer, typename T, typename... Rest>
double sum(Printer printer, T t, Rest... rest)
{
printer.print();
return sum_impl(t, rest...);
}