使用 C++ 模板函数编译时间递归

Posted

技术标签:

【中文标题】使用 C++ 模板函数编译时间递归【英文标题】:Compile time recursive using C++ template functions 【发布时间】:2017-11-29 10:56:34 【问题描述】:

下面的代码是编译时递归的吗?我想知道如何确认这一点,即任何调试器、分析器等来理解模板程序。

#include <iostream>
#include <vector>
#include <thread>
std::vector<std::thread> vecc;

void thread_fn()
    std::cout<<"Thread function"<<"\n"; 


template <int n>
void create_thread()
    create_thread<n-1>();
    vecc.push_back(std::thread(thread_fn));

template<>
void create_thread<0>()
    vecc.push_back(std::thread(thread_fn));


int main()

    create_thread<10>();
    for(auto &a: vecc)
        a.join();
    

【问题讨论】:

你有什么问题? 尽管你在问什么,我不认为线程可以在编译时产生。 create_thread&lt;10&gt;() 的生成代码与 vecc.push_back(std::thread(thread_fn)) 的 10 行具有相同的含义,如果这就是您的要求 相关(但更广泛)***.com/questions/7325910/… 模板是递归的,模板是在编译时实例化的,所以... 【参考方案1】:

对于 gcc,您可以使用 -fdump-tree-original 选项:

g++ -fdump-tree-original -Wall -pthread 111.cpp

现在您可以看到create_thread 模板是如何在生成的转储中实例化的:

$ grep create_thread 111.cpp.003t.original
;; Function void create_thread() [with int n = 0] (null)
  create_thread<10> () >>>>>;
;; Function void create_thread() [with int n = 10] (null)
  create_thread<9> () >>>>>;
;; Function void create_thread() [with int n = 9] (null)
  create_thread<8> () >>>>>;
;; Function void create_thread() [with int n = 8] (null)
  create_thread<7> () >>>>>;
;; Function void create_thread() [with int n = 7] (null)
  create_thread<6> () >>>>>;
;; Function void create_thread() [with int n = 6] (null)
  create_thread<5> () >>>>>;
;; Function void create_thread() [with int n = 5] (null)
  create_thread<4> () >>>>>;
;; Function void create_thread() [with int n = 4] (null)
  create_thread<3> () >>>>>;
;; Function void create_thread() [with int n = 3] (null)
  create_thread<2> () >>>>>;
;; Function void create_thread() [with int n = 2] (null)
  create_thread<1> () >>>>>;
;; Function void create_thread() [with int n = 1] (null)
  create_thread<0> () >>>>>;

【讨论】:

以上是关于使用 C++ 模板函数编译时间递归的主要内容,如果未能解决你的问题,请参考以下文章

C++函数模板机制结论

c++模板使用与成员函数指针

C++:函数模板的本质

《c++从0到99》 六 模板

《c++从0到99》 六 模板

《c++从0到99》 六 模板