Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用模板元编程计算阶乘

用模板元编程计算阶乘
EN

Stack Overflow用户
提问于 2010-06-20 20:26:59
回答 5查看 27.2K关注 0票数 25

我不明白这段代码(来自维基百科)是如何工作的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <int N>
struct Factorial 
{
    enum { value = N * Factorial<N - 1>::value };
};

template <>
struct Factorial<0> 
{
    enum { value = 1 };
};

// Factorial<4>::value == 24
// Factorial<0>::value == 1
void foo()
{
    int x = Factorial<4>::value; // == 24
    int y = Factorial<0>::value; // == 1
}
  • 采用<int N>的奇怪模板是什么?
  • 第二个奇怪的模板<>是什么?
  • enum是用来做什么的?
  • 与一般的运行时阶乘计算相比,使用这种方法有什么好处呢?
  • 你们多久用一次这个?我使用C++已经有一段时间了,但以前从未使用过。我错过了C++有多大一部分?

谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-06-20 20:51:39

  • 采用<int N>的奇怪模板是什么?

在C++中,模板参数可以是类型(以classtypename作为前缀),也可以是整数(以intunsigned int为前缀)。这是第二种情况。

  • 第二个奇怪的template <>是什么?

template<> struct Factorial<0>是阶乘类模板的一个完全专门化,这意味着0被认为是一个特殊值,它对应于它自己版本的阶乘。

  • 这些帐篷是做什么用的?

枚举是计算元编程C++中值的方法。

  • 与一般的运行时阶乘计算相比,使用这种方法有什么好处呢?

首先,创建这段代码的原因是为了证明微积分可以使用元编程来完成。其优点是生成的代码非常高效(调用Factorial<4>::value相当于在代码中编写"24“。

  • 你们多久用一次这个?我使用C++已经有一段时间了,但以前从未使用过。我错过了C++有多大一部分?

这种方法很少实现这样的功能,但是现在元编程的使用越来越多。请参阅Boost元编程库以获得可以完成的操作的提示。

票数 28
EN

Stack Overflow用户

发布于 2010-06-21 03:23:57

采用<int N>的这个奇怪的模板是什么?

可以对类/类型、值和指针进行模板声明。您通常不会将此表单视为定义模板,很少在模板参数中使用常量。

第二个奇怪的模板<>是什么?

考虑模板的最佳方法是做一些类似于编译器所做的事情:将模板看作一个类,在该类中用该类型的实际值替换模板参数。

这是指:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <int N>
struct Factorial 
{
    enum { value = N * Factorial<N - 1>::value };
};

Factorial<2>::value相当于:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// generated by the compiler when Factorial<2>::value is encountered in code:
struct Factorial2 { enum { value = 2 * Factorial1::value }; };
struct Factorial1 { enum { value = 1 * Factorial0::value }; };
// not generated by compiler, as it was explicitly defined in the code you ask about:
template <> struct Factorial<0> { enum { value = 1 }; }; // defines Factorial<0>

这些帐篷是做什么用的?

它们在编译时使用const value定义枚举,允许您编写类似示例中的客户端代码。

与一般的运行时阶乘计算相比,使用这种方法有什么好处呢?

其优点是效率高。由于值计算是在编译时扩展的,因此Factorial<10>::value的运行时成本与Factorial<1>::value相同。在编译的代码中,它们都是常量。如果要在性能关键代码中计算阶乘,并且在编译时知道它是哪个值,则应该这样做,或者脱机计算它,并在代码中定义一个带有预先计算值的常量。

你们多久用一次这个?

您指的是常数的递归计算吗?如果是这样的话,就不会经常。

这是模板中常量的定义吗?经常:)

“此”是特定类型模板的细化吗?很多时候。我理解在一些STL实现中,std::vector有一个完全独立的实现(一个具有8个元素的std::vector<bool>不需要超过一个字节来存储这些值)。

我使用C++已经有一段时间了,但以前从未使用过。我错过了C++有多大一部分?

不一定是个大角色。如果您使用boost,您使用的代码很可能是使用这样的方式实现的。

票数 6
EN

Stack Overflow用户

发布于 2010-06-21 06:26:59

我发现这个答案约翰斯沙伊伯在另一个问题上很有帮助。

我把答案贴在这里,假设约翰对此没意见。如果他不喜欢的话,我就把它去掉

是的,它是一个非类型的参数.可以有几种模板参数。

  • 类型参数
    • 类型
    • 模板(只有类,没有函数)

  • 非类型参数
    • 指针
    • 参考文献
    • 积分常数表达式

你拥有的是最后一种。它是一个编译时间常数(所谓的常量表达式),是整数或枚举的类型。在标准中查找它之后,我不得不将类模板移到类型部分--尽管模板不是类型。但它们被称为类型参数,目的是为了描述这些类型。您可以拥有指针(也可以是成员指针)和对具有外部链接的对象/函数的引用(这些对象/函数可以从其他对象文件链接,并且其地址在整个程序中是唯一的)。示例:

模板类型参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template<typename T>
struct Container {
    T t;
};

// pass type "long" as argument.
Container<long> test;

模板整数参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template<unsigned int S>
struct Vector {
    unsigned char bytes[S];
};

// pass 3 as argument.
Vector<3> test;

模板指针参数(将指针传递给函数)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template<void (*F)()>
struct FunctionWrapper {
    static void call_it() { F(); }
};

// pass address of function do_it as argument.
void do_it() { }
FunctionWrapper<&do_it> test;

模板引用参数(传递整数)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template<int &A>
struct SillyExample {
    static void do_it() { A = 10; }
};

// pass flag as argument
int flag;
SillyExample<flag> test;

模板参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template<template<typename T> class AllocatePolicy>
struct Pool {
    void allocate(size_t n) {
        int *p = AllocatePolicy<int>::allocate(n);
    }
};

// pass the template "allocator" as argument. 
template<typename T>
struct allocator { static T * allocate(size_t n) { return 0; } };
Pool<allocator> test;

没有任何参数的模板是不可能的。但是没有任何显式参数的模板是可能的-它有默认参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template<unsigned int SIZE = 3>
struct Vector {
    unsigned char buffer[SIZE];
};

Vector<> test;

从语法上讲,template<>保留用于标记显式模板专门化,而不是没有参数的模板:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template<>
struct Vector<3> {
    // alternative definition for SIZE == 3
};
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3082113

复制
相关文章
模板:大数阶乘
#include <stdio.h> int main() { const int maxn = ...; //n的阶乘所得的值的大致位数 int a[maxn];//储存每一位所得到的数 int temp,digit,n,i,j=0;//temp每次的得数 digit每次得数的位数 scanf("%d",&n); a[0]=1;//从1开始乘 digit=1;//位数从第一位开始 for(i=2;i<=n;i++)
_DIY
2019/09/11
5150
阶乘计算【 数组模拟阶乘 】
n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
Lokinli
2023/03/09
7660
C++ 模板元编程简介
模板元编程(Template Metaprogramming,TMP)是编写生成或操纵程序的程序,也是一种复杂且功能强大的编程范式(Programming Paradigm)。C++模板给C++提供了元编程的能力,但大部分用户对 C++ 模板的使用并不是很频繁,大致限于泛型编程,在一些系统级的代码,尤其是对通用性、性能要求极高的基础库(如 STL、Boost)几乎不可避免在大量地使用 C++ 模板以及模板元编程。
恋喵大鲤鱼
2018/09/27
6.9K0
C++ 模板元编程简介
计算阶乘之和
阶乘是数学里的一种术语;阶乘指从1乘以2乘以3乘以4一直乘到所要求的数;在表达阶乘时,用“!”来表示。乘一般都难以计算,因为数值较大,而用python就不用当心阶乘的计算结果会溢出。
算法与编程之美
2022/02/17
6460
计算阶乘之和
Python计算阶乘
通过用户输入数字计算阶乘 1.获取用户输入的数字 num = int(input("请输入一个数字: ")) factorial = 1 2.判断数字 负数没有阶乘 0的阶乘还是0 if num < 0: print("抱歉,负数没有阶乘") elif num == 0: print("0 的阶乘为 1") else: for i in range(1, num + 1): factorial = factorial * i print("%d 的阶乘为 %d
织幻妖
2021/06/27
1.5K0
Python计算阶乘
JAVA编程--阶乘运算
代码如下: import java.math.BigInteger; import java.util.ArrayList; public class doFactorial { public static void main(String[] args) { int number=5; System.out.println("方法一算得"+number+"的阶乘为:"+Wayone(number)); System.out.prin
用户8711264
2023/03/21
6590
基础练习 阶乘计算
  n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。   将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。   首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
刘开心_1266679
2019/02/14
8850
php递归函数详解_用php递归函数实现阶乘计算
white=imagecolorallocate(im,0xFF,0xFF,0xFF);
全栈程序员站长
2022/09/22
2.8K0
元编程(用程序写代码)
元编程的主要思想是用程序在运行时写代码,再在运行时在编译代码。 元编程又被称为两级编程 (two-level programming),生成式编程 (generative programming) 或 模板元编程 (template metaprogramming)
sofu456
2022/05/06
3900
Python|用python解决阶乘问题
阶乘是我们在很多的数学问题中会遇到的,但是如果我们需要一个很大的数的阶乘,那么自己算起来就会很麻烦,那么我们就能用python来解决这个问题。让阶乘编程一个简单的问题
算法与编程之美
2020/02/25
1.3K0
数的阶乘计算器
/* 功能:数的阶乘计算器 日期:2013-4-19 */ #include <stdio.h> #include <stdlib.h> #include<math.h>
WindCoder
2018/09/20
1.1K0
蓝桥杯 基础练习 阶乘计算
n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。   将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。   首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
Meng小羽
2019/12/23
6370
Python应用之计算阶乘
当 m 是自然数时,表示不超过 m 且与 m 有相同奇偶性的所有正整数的乘积。如:
芯动大师
2022/11/15
1.7K0
Python应用之计算阶乘
如何花式计算20的阶乘?
先来看看我的回答:https://www.zhihu.com/question/365763395/answer/2070162652
godweiyang
2021/09/08
1.3K0
73-递归函数计算阶乘
递归函数就是在函数内部继续调用自己。 def func(n): # 5 if n == 1: return n return n * func(n - 1) # 5 * func(4) # 5 * 4 * func(3) # 5 * 4 * 3 * func(2) # 5 * 4 * 3 * 2 * func(1) # 5 * 4 * 3 * 2 * 1 if __name__ ==
凯茜的老爸
2018/09/11
7910
PowerBI DAX 计算阶乘的方法
非常碰巧,在最近几个项目中都遇见计算阶乘的情况,主要是计算排列组合数的时候会用到阶乘。
BI佐罗
2019/09/23
1.5K0
PowerBI DAX 计算阶乘的方法
用ORCA计算旋轨耦合矩阵元
旋轨耦合的理论涉及相对论量子力学,此处仅以定性的形式粗略介绍相关背景。相对论效应是指进行电子结构计算时Dirac方程与Schrödinger方程这两个理论模型之间的差别。Dirac于1928年建立了电子运动的相对论方程——Dirac方程,但是Dirac本人却认为在化学问题中,价电子受内层电子的屏蔽,其运动速度比光速小很多,相对论效应很小。但在后来的研究中,人们逐渐认识到相对论效应的重要性。自旋-轨道耦合(spin-orbit coupling, SOC),简称旋轨耦合,是一种相对论效应,指电子的自旋和轨道运动之间的相互作用。在非相对论量子力学中,自旋态改变的跃迁是禁阻的;当考虑旋轨耦合时,这样的过程才能发生,比如系间窜越(intersystem crossing, ISC)、磷光发射等过程。在《用高斯计算磷光发射能》一文中我们提到,用TD-DFT直接计算T1和S0之间的跃迁,得到的振子强度始终为0,只有当考虑旋轨耦合后,振子强度才不为0。
用户7592569
2021/08/10
3.6K1
用ORCA计算旋轨耦合矩阵元
【蓝桥杯】BASIC-30 阶乘计算
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
喜欢ctrl的cxk
2019/11/13
8490
蓝桥杯 试题 基础练习 阶乘计算
#include<bits/stdc++.h> using namespace std; const int maxn = 50000; int f[maxn];//用于存放得到阶乘后每一个数字。 int main(){ int i,j,n; while(~scanf("%d",&n)){ memset(f,0,sizeof(f)); f[0]=1; //小于2的阶乘都为1 for(i=2;i
杨鹏伟
2020/09/11
5580
现代C++之模板元编程(今天写个If与While)
今天就放轻松,有可能代码写的看的很晦涩,自己多敲几遍即可,下面来进入正文,如何使用模板元编程实现IF与WHILE。
公众号guangcity
2020/02/13
1K0

相似问题

用模板元编程计算数据编译时间

24

计算Fibonacci的模板元编程

34

元编程,阶乘,C++,boost

31

用Python计算阶乘

515

C++模板阶乘计算

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文