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; }
我可以使用模板函数进行这样的模板元编程吗?这是允许的吗?如tobi303在注释中所述,仅使用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是一个模板参数,而不是一个常规参数,因此它只能出现在模板参数列表中(在
(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函数声明需要声明参数类型而不是参数值。没有意义,无论是否为模板。请注意,您链接的示例中的递归是关于类型的(即发生在编译时),而您在这里尝试执行的递归是关于调用函数的(即在运行时发生)。也许有一种方法可以使用模板函数,但当您使用递归运行时调用来计算阶乘时,您不需要模板。有没有一种方法可以在编译时使用模板函数来完成这项工作,如我链接的示例中所示?对于哑编译器和/或非优化调试版本,contexpr函数方法可以与之相比。@You:如果使用正确,它会正确地执行任务int multiply(t)
不会在编译时强制求值。要强制编译时求值: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; }