首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++11递归变量模板

c++11递归变量模板
EN

Stack Overflow用户
提问于 2015-05-05 10:01:11
回答 4查看 1.1K关注 0票数 3

我试图了解递归的各种模板是如何工作的。

代码语言:javascript
复制
#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");
}

输出:

代码语言:javascript
复制
apple, orange, mango
**End**
**End**

我只期望有一个**End**。为什么要印两次?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-05-05 10:12:49

呼叫树:

代码语言:javascript
复制
 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**";
票数 10
EN

Stack Overflow用户

发布于 2015-05-05 10:24:36

完成对WriteLog(std::forward<Ts>(Vals)...);的递归调用后,它必须执行下一个语句。此函数被调用两次(一次用于"apple",一次用于"orange"),因此编写了两次"**End**"打印输出。

"mango"的最后一次递归调用直接进入第一个重载,因为包中只剩下一个参数。

票数 3
EN

Stack Overflow用户

发布于 2015-05-05 10:10:49

的调用打印**End**

  • WriteLog("apple, ", "orange, ", "mango"); in main
  • WriteLog("orange, ", "mango"); (带行WriteLog(std::forward<Ts>(Vals)...);)在WriteLog("apple, ", "orange, ", "mango")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30049877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档