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);