C++ 使用C++;模板函数

C++ 使用C++;模板函数,c++,templates,recursion,C++,Templates,Recursion,以下代码是编译时递归的吗?我想知道如何确认这一点,即任何调试器,探查器等,以了解模板程序 #include <iostream> #include <vector> #include <thread> std::vector<std::thread> vecc; void thread_fn(){ std::cout<<"Thread function"<<"\n"; } template <int n&

以下代码是编译时递归的吗?我想知道如何确认这一点,即任何调试器,探查器等,以了解模板程序

#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();
    }
}
#包括
#包括
#包括
std::vector-vecc;
无效线程_fn(){

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

g++ -fdump-tree-original -Wall -pthread 111.cpp
现在您可以看到
create\u 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> () >>>>>;
$grep create\u thread 111.cpp.003t.original
;函数void create_thread()
创建_线程()>>>>>>;
;函数void create_thread()
创建_线程()>>>>>>;
;函数void create_thread()
创建_线程()>>>>>>;
;函数void create_thread()
创建_线程()>>>>>>;
;函数void create_thread()
创建_线程()>>>>>>;
;函数void create_thread()
创建_线程()>>>>>>;
;函数void create_thread()
创建_线程()>>>>>>;
;函数void create_thread()
创建_线程()>>>>>>;
;函数void create_thread()
创建_线程()>>>>>>;
;函数void create_thread()
创建_线程()>>>>>>;
;函数void create_thread()
创建_线程()>>>>>>;

你的问题是什么?不管你怎么问,我不认为线程可以在编译时产生。为
create\u thread()
生成的代码与10行
vecc.push\u back(std::thread(thread\u fn))
的含义相同,如果你问的是相关的(但更广泛的)模板是递归的,并且在编译时实例化模板,所以。。。