Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;使用模板函数的模板元编程 我最近一直在学习C++中的模板元程序设计。 在检查了计算阶乘的示例后,我想知道是否同样的事情只能用模板函数而不是模板类来完成。 我的第一次尝试如下所示 #include <stdio.h> #include <iostream> using namespace std; template <int t> int multiply(t) { return (multiply(t-1) * t); } template <> int multiply(1) { return 1; } int main () { cout << multiply(5) << endl; return 0; }_C++_Templates_Recursion - Fatal编程技术网

C++;使用模板函数的模板元编程 我最近一直在学习C++中的模板元程序设计。 在检查了计算阶乘的示例后,我想知道是否同样的事情只能用模板函数而不是模板类来完成。 我的第一次尝试如下所示 #include <stdio.h> #include <iostream> using namespace std; template <int t> int multiply(t) { return (multiply(t-1) * t); } template <> int multiply(1) { return 1; } int main () { cout << multiply(5) << endl; return 0; }

C++;使用模板函数的模板元编程 我最近一直在学习C++中的模板元程序设计。 在检查了计算阶乘的示例后,我想知道是否同样的事情只能用模板函数而不是模板类来完成。 我的第一次尝试如下所示 #include <stdio.h> #include <iostream> using namespace std; template <int t> int multiply(t) { return (multiply(t-1) * t); } template <> int multiply(1) { return 1; } int main () { cout << multiply(5) << endl; return 0; },c++,templates,recursion,C++,Templates,Recursion,我可以使用模板函数进行这样的模板元编程吗?这是允许的吗?如tobi303在注释中所述,仅使用(t)作为函数的参数列表,其中t不是类型名,没有任何意义 由于int t是一个模板参数,而不是一个常规参数,因此它只能出现在模板参数列表中(在

我可以使用模板函数进行这样的模板元编程吗?这是允许的吗?

如tobi303在注释中所述,仅使用
(t)
作为函数的参数列表,其中
t
不是类型名,没有任何意义

由于
int t
是一个模板参数,而不是一个常规参数,因此它只能出现在模板参数列表中(在
尖括号之间),而不能出现在功能参数列表中(在
括号之间)。模板参数也必须这样传递,即
multiply()
而不是代码中的
multiply(5)

您可以使用以下内容:

#include <iostream>

using namespace std;

template <int t>
constexpr int multiply() {
    return multiply<t - 1>() * t;
}

template <>
constexpr int multiply<1>() {
    return 1;
}

int main () {
    cout << multiply<5>() << endl;
    return 0;
}
#包括
使用名称空间std;
模板
constexpr int multiply(){
返回乘法()*t;
}
模板
constexpr int multiply(){
返回1;
}
int main(){

cout函数声明需要声明参数类型而不是参数值。
int multiply(t)
没有意义,无论是否为模板。请注意,您链接的示例中的递归是关于类型的(即发生在编译时),而您在这里尝试执行的递归是关于调用函数的(即在运行时发生)。也许有一种方法可以使用模板函数,但当您使用递归运行时调用来计算阶乘时,您不需要模板。有没有一种方法可以在编译时使用模板函数来完成这项工作,如我链接的示例中所示?对于哑编译器和/或非优化调试版本,contexpr函数方法可以与之相比。@You:如果使用正确,它会正确地执行任务
constepr
不会在编译时强制求值。要强制编译时求值:
constepr auto fact5=multiply();std::cout@Jarod42什么保证了这一点?因为
constepr
变量应该在编译时已知,它的求值也在编译时进行。
#include <iostream>

using namespace std;

template <int t>
constexpr int multiply() {
    return multiply<t - 1>() * t;
}

template <>
constexpr int multiply<1>() {
    return 1;
}

int main () {
    cout << multiply<5>() << endl;
    return 0;
}