想象一下这样的代码:可变参数模板选择比较常见的模板,而不是超载
#include <iostream>
void PrintInternal() {
std::cout << std::endl;
}
template <typename T, typename...ARGS>
void PrintInternal(const T& head, const ARGS&...rest) {
std::cout << head << " ";
PrintInternal(rest...);
};
template <typename...ARGS>
void PrintInternal(const double& head, const ARGS&...rest) {
std::cout << "DBL!!! " << head << " ";
PrintInternal(rest...);
}
template <typename...ARGS>
void Print(const ARGS&...args) {
PrintInternal(args...);
}
int main() {
Print(1.1, 2, 3.3, 4);
Print(0, 1.1, 2, 3.3, 4);
return 0;
}
首先Print
输出:
DBL! 1.1 2 3.3 4
我的期望是,它会输出DBL! 3.3之前还是没有DBL!在所有。但为什么一个?
二Print
输出:
0 1.1 2 3.3 4
为什么没有DBL !!!如果我们在第一个例子中有一个,那么输出就像是一样。
以及如何实现,每个double
我会输出一些不同的部分专业化?我想,这简单的重载应该没问题......
链接cpp.sh查看编译结果 - >http://cpp.sh/42cz
仔细看看,小心。第二个打印有0作为第一个参数,对不对? (0假设有整数类型)。你的“DBL !!”将第一个参数作为double。 说,如果你试过0或0.0它会工作 –
是的,你在这里是正确的,谢谢,但是,更多的奥秘仍未解决:) – Starl1ght
模板函数的顺序是重要的。在调用之前,模板调用的所有函数都需要可见。 – NathanOliver