C++ C++;函数式编程代码片段

C++ C++;函数式编程代码片段,c++,c++11,recursion,functional-programming,variadic-templates,C++,C++11,Recursion,Functional Programming,Variadic Templates,我一直在从事一个名为:C++11/14函数式编程特性的项目(我在大学的一门课程)。 关于这类主题,有几个现有的来源和类似的介绍,我发现了一个 不久前,它包含了一些我还没有完全理解的代码片段(不知何故,它们可以连接到函数式编程)。片段A和B属于递归,而C属于惰性评估。我想在下面与大家分享: 片段A: #include <iostream> template <int N> struct Factorial { static int const val = N *

我一直在从事一个名为:C++11/14函数式编程特性的项目(我在大学的一门课程)。 关于这类主题,有几个现有的来源和类似的介绍,我发现了一个 不久前,它包含了一些我还没有完全理解的代码片段(不知何故,它们可以连接到函数式编程)。片段AB属于递归,而C属于惰性评估。我想在下面与大家分享:

片段A

#include <iostream>

template <int N>
struct Factorial {
    static int const val = N * Factorial<N - 1>::val;
};

template <>
struct Factorial <0> {
    static int const val = 1;
};

int main() {
    int factorial_of_6 = Factorial<6>::val;
    std::cout << factorial_of_6 << std::endl;
    return 0;
}
#include <iostream>

template <int ...>
struct my_sum;

template <>
struct my_sum <> {
    static const int value {0};
};

template <int i, int ... tail>
struct my_sum <i, tail ...> {
    static const int value = i + my_sum<tail ...>::value;
};

int main() {
    int sum {my_sum<1, 2, 3, 4, 5>::value};
    std::cout << sum << std::endl;
    return 0;
}
#include <iostream>

template <typename... Args>
void some_function (Args ...) {
    std::cout << sizeof...(Args) << std::endl;
}

int main() {
    some_function ("Every little thing gonna be alright...", 1.0 / 0.0);
    return 0;
}
#包括
模板
结构阶乘{
静态int const val=N*阶乘::val;
};
模板
结构阶乘{
静态int const val=1;
};
int main(){
int factorial_of_6=阶乘::val;
std::cout片段A

这称为
模板元编程
,它基本上是一种使用模板在编译时生成代码的技术。这提高了运行时性能,因为计算不是在运行时完成的,而是在编译时完成的

代码段A在编译时计算给定数字的阶乘:

template <int N>
struct Factorial {
    static int const val = N * Factorial<N - 1>::val;
};
变量是
const
,因为给定数字的阶乘总是相同的,而且如果不是
const
,项目将不会编译,因为编译器无法知道您是否在其他地方更改了变量


变量的值为
N*factorial对于C,参数不是惰性计算的。有计算的(然后使用“仿佛”规则进行优化可能会丢弃它们)。非常感谢您的详细回答!但如果您不介意的话,我想再问一个问题:我已经了解了您关于C的解释,但如果我使用整数,它是否有意义?表达式将被计算,程序将崩溃。这与延迟计算有什么相似之处吗?(就像上面提到的Jarod42)@ZsoltLászló我不这么认为,因为正如Jarod42所说,C++中没有内置的惰性计算,谢谢你。顺便说一下,从那以后,我就成功地运行了代码:将-O3放入编译器选项可以避免异常(输出是预期的2)。
Factorial factorial;
factorial.val;
template <>
struct Factorial <0> {
    static int const val = 1;
};
template <int ...>
struct my_sum;
template <>
struct my_sum <> {
    static const int value {0};
};
template <int i, int ... tail>
struct my_sum <i, tail ...> {
    static const int value = i + my_sum<tail ...>::value;
};
int sum = my_sum<1, 2, 3>::value;
int zero = 0; 
double d = 1.0 / zero;