C++ 带有一个显式参数的模板

C++ 带有一个显式参数的模板,c++,templates,metaprogramming,template-meta-programming,C++,Templates,Metaprogramming,Template Meta Programming,我尝试在元编程的阶乘示例中添加另一个模板参数。但是下面的方法不起作用。正确的方法是什么 代码: #包括 模板 内联无效循环(TI){ std::cout不能部分专门化函数模板。句号 在C++17中,您将能够编写: template <typename T, int Depth> inline void loop(T i){ std::cout << i; if constexpr (Depth > 0) { loop<T, De

我尝试在元编程的阶乘示例中添加另一个模板参数。但是下面的方法不起作用。正确的方法是什么

代码:

#包括
模板
内联无效循环(TI){

std::cout不能部分专门化函数模板。句号

在C++17中,您将能够编写:

template <typename T, int Depth>
inline void loop(T i){
    std::cout << i;
    if constexpr (Depth > 0) {
        loop<T, Depth-1>(i - 1);
    }
}

您可以使用助手类及其专门化来完成真正的工作

template <typename T, int Depth> struct LoopHelper
{
   static void doit(T i)
   {
      std::cout << i;
      LoopHelper<T, Depth-1>::doit(i);
   }
};

template <typename T> struct LoopHelper<T,0>
{
   static void doit(T i)
   {
      std::cout << i;
   }
};


template <typename T, int Depth>
inline void loop(T i){
   LoopHelper<T, Depth>::doit(i);
}
然后,您可以使用:

int i = 10;
loop<3>(i);
inti=10;
回路(i);

T
被推断为
int

如何调用该循环?我的意思是主函数应该是什么样的?如果我使用
intmain(void){inti=10;loop(I,std::integral_constant{}},我会出错
并用g++-std=c++14编译。错误是模板实例化深度超过900。@rxu,是的,确实如此。我在发布答案之前测试了它。
template <typename T>
inline void loop(T i, std::integral_constant<int, 0> ) {
    std::cout << i << std::endl;
}

template <typename T, int Depth>
inline void loop(T i, std::integral_constant<int, Depth> ){
    std::cout << i;
    loop(i - 1, std::integral_constant<int, Depth-1>{} );
}
template <typename T, int Depth> struct LoopHelper
{
   static void doit(T i)
   {
      std::cout << i;
      LoopHelper<T, Depth-1>::doit(i);
   }
};

template <typename T> struct LoopHelper<T,0>
{
   static void doit(T i)
   {
      std::cout << i;
   }
};


template <typename T, int Depth>
inline void loop(T i){
   LoopHelper<T, Depth>::doit(i);
}
template <int Depth, typename T>
inline void loop(T i){
   LoopHelper<T, Depth>::doit(i);
}
int i = 10;
loop<3>(i);