我试图了解递归的各种模板是如何工作的。
#include <iostream>
template<typename T>
static inline void WriteLog(T&& msg) {
std::wcout << std::forward<T>(msg);
}
template<typename T, typename... Ts>
static void WriteLog(T&& msg, Ts&&... Vals) {
WriteLog(std::forward<T>(msg));
WriteLog(std::forward<Ts>(Vals)...);
std::wcout << "\n**End**";
}
int main() {
WriteLog("apple, ", "orange, ", "mango");
}输出:
apple, orange, mango
**End**
**End**我只期望有一个**End**。为什么要印两次?
发布于 2015-05-05 10:12:49
呼叫树:
WriteLog("apple, ", "orange, ", "mango");
->WriteLog("apple, ");
-> std::wcout << "apple, ";
->WriteLog( "orange, ", "mango");
->WriteLog("orange, ");
-> std::wcout << "orange, ";
->WriteLog( "mango");
-> std::wcout << "mango";
->std::wcout << "\n**End**";
->std::wcout << "\n**End**";发布于 2015-05-05 10:24:36
完成对WriteLog(std::forward<Ts>(Vals)...);的递归调用后,它必须执行下一个语句。此函数被调用两次(一次用于"apple",一次用于"orange"),因此编写了两次"**End**"打印输出。
对"mango"的最后一次递归调用直接进入第一个重载,因为包中只剩下一个参数。
发布于 2015-05-05 10:10:49
的调用打印**End**。
WriteLog("apple, ", "orange, ", "mango"); in mainWriteLog("orange, ", "mango"); (带行WriteLog(std::forward<Ts>(Vals)...);)在WriteLog("apple, ", "orange, ", "mango")中https://stackoverflow.com/questions/30049877
复制相似问题