具有一个显式参数的模板
template with one explicit argument
我尝试将另一个模板参数添加到元编程的阶乘示例中。但以下不起作用。正确的做法是什么?
代码:
#include <iostream>
template <typename T, int Depth>
inline void loop(T i){
std::cout << i;
loop<T, Depth-1>(i - 1);
}
template <typename T, int Depth>
inline void loop<T, 0>(T i){
std::cout << i << std::endl;
}
int main(void){
int i = 10;
loop<int, 3>(i);
}
错误:
test4.cpp(9): error: an explicit template argument list is not allowed on this declaration
inline void loop<T, 0>(T i){
您不能部分特化函数模板。句号。
在 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);
}
}
在那之前,我建议只将深度作为 integral_constant
参数:
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>{} );
}
您可以使用助手 class 及其专业化来完成真正的工作。
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);
}
进一步细化
我建议更改 loop
以允许扣除 T
。
template <int Depth, typename T>
inline void loop(T i){
LoopHelper<T, Depth>::doit(i);
}
那么,您可以使用:
int i = 10;
loop<3>(i);
并让 T
推导为 int
。
我尝试将另一个模板参数添加到元编程的阶乘示例中。但以下不起作用。正确的做法是什么?
代码:
#include <iostream>
template <typename T, int Depth>
inline void loop(T i){
std::cout << i;
loop<T, Depth-1>(i - 1);
}
template <typename T, int Depth>
inline void loop<T, 0>(T i){
std::cout << i << std::endl;
}
int main(void){
int i = 10;
loop<int, 3>(i);
}
错误:
test4.cpp(9): error: an explicit template argument list is not allowed on this declaration
inline void loop<T, 0>(T i){
您不能部分特化函数模板。句号。
在 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);
}
}
在那之前,我建议只将深度作为 integral_constant
参数:
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>{} );
}
您可以使用助手 class 及其专业化来完成真正的工作。
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);
}
进一步细化
我建议更改 loop
以允许扣除 T
。
template <int Depth, typename T>
inline void loop(T i){
LoopHelper<T, Depth>::doit(i);
}
那么,您可以使用:
int i = 10;
loop<3>(i);
并让 T
推导为 int
。