constexpr的用法

我的观点:今天有幸看到各位大神们在讨论constexpr的前途,有人说vs2010、2011、2012、2013都不支持,所以就觉得没用。好吧,我的世界中vs并不是不可获取,好吧,自己为了口头的胜利开始胡扯了。constexpr就像是一个告诉编译器,this is a const XXtype.但是各种有趣的实验证明了这个玩意还是有用的。

我来给你们验证一下:

1.如数一个数字,计算出它的!的结果(忘记叫什么了eg:5!==5*4*3*2*1==120)

 1 //build-1234-Desktop_Qt_5_3_MinGW_32bit-Debug
 2 #include <iostream>
 3 constexpr int fact(int n)
 4 {
 5     return n<2?1:(n*fact(n-1));
 6 }
 7 constexpr int fact2(int n){
 8     return n<2?1:(n*fact(n-1));
 9 }
10 template<int n>class print{
11 public:
12     print(){std::cout<<n<<‘\t‘;}
13 };
14 int main()
15 {
16     std::cout<<fact(5)<<‘\t‘<<fact2(6)<<std::endl;
17     print<fact(5)> out1;
18     print<fact2(6)> out2;
19     return 0;
20 }
21 //output
22 /**
23 120     720
24 120     720
25 */

本例也就是constexpr最基本的功能,可以使一个函数转化成一个基本类型一样的类型。使C++看起来更加完善

甚至可以把上面的例子中修改为print(){std::cout<<(char)n<<‘\t‘;}

2、可以用在一些不需要修改的地方,防止修改。(const)

 1 //build-1234-Desktop_Qt_5_3_MinGW_32bit-Debug
 2 #include <iostream>
 3 #include <stdexcept>
 4
 5 class conststr{//定义一个const string类
 6     const char* p;
 7     std::size_t N;
 8 public:
 9     template<std::size_t Num>
10     constexpr conststr(const char(&a)[Num]):p(a),N(Num-1){}
11     constexpr char operator[](std::size_t n){//后面有用
12         return n<N?p[n]:throw std::out_of_range("");
13     }
14     constexpr std::size_t size(){
15         return N;
16     }
17 };
18 constexpr std::size_t countlower(conststr s,std::size_t c=0,std::size_t n=0){//计算‘a‘<X>‘z‘
19     return n==s.size()?c:
20                        s[n]>=‘a‘&& s[n]<=‘z‘?
21                            countlower(s,c+1,n+1):countlower(s,c,n+1);
22 }
23
24 int main()
25 {
26     std::cout<<countlower("hello,world")<<std::endl;
27     std::cout<<countlower("hello,world___and___it")<<std::endl;
28     return 0;
29 }
30 //output
31 /**
32 10
33 15
34 */

本文参考地方:http://tool.oschina.net/apidocs/apidoc?api=cpp%2Fen%2Fcpp.html

时间: 2024-12-29 23:45:49

constexpr的用法的相关文章

C++新标准:constexpr关键字

一.constexpr意义 将变量声明为constexpr类型以便由编译器来验证变量是否是一个常量表达式(不会改变,在编译过程中就能得到计算结果的表达式).是一种比const更强的约束,这样可以得到更好的效率和安全性. 二.constexpr用法 1.修饰函数 /*1.如果size在编译时能确定,那么返回值就可以是constexpr,编译通过*/ constexpr int getSizeA(int size) { return 4*size; } /*2.编译通过,有告警:在constexpr

C/C++ static 用法总结

 static用法   a.静态局部变量,成为静态局部变量(拥有记忆功能和全局存储权限) b.静态全局变量(限制对应全局变量被被其他文件调用) c.静态函数 d.静态类成员(标识此成员属于类而非属于某个特定对象) 1.静态局部变量 1.1静态局部变量在函数内定义,拥有静态存储期限而不再是自动存储期限,因为静态存储期限的变量拥有永久的 存储单元,所以在整个程序存储期间都会保留变量的值,尽管退出函数后变量依然存在,但不能使用. 1.2静态局部变量始终拥有块作用域.(与自动变量作用域相同) 1.3

const 和 constexpr

在C++中,const 这个关键字用法非常灵活,导致我总会搞不清作用是干啥的.灵活使用const会大大改善程序. const 是C++的一种类型修饰符,是不可改变的不能被更新的. 1.const 修饰成员变量 const int a = 1; 此时的a在后面的操作中不能被改变,否则会报错 2.const 修饰函数参数 (1)void f( const int i ){}    防止意外的修改,增强程序的健壮性,同样在函数内不能被修改 (2)void f(const int* i){} 指针所指的

【C++ Primer 第六章】 constexpr函数

constexpr函数 constexpr函数: constexpr函数是指用于常量表达式的函数,函数的返回值类型以及所有的形参类型必须是字面值,而且函数必须有且只有一条return语句. 1 [tect2.cpp] 2 #include <iostream> 3 using namespace stdl; 4 5 constexpr int screen(int x) // constexpr 6 { 7 return x; 8 } 9 10 int main() 11 { 12 const

js中获取时间new date()的用法

js中获取时间new date()的用法 获取时间:   var myDate = new Date();//获取系统当前时间 获取特定格式的时间: 1 myDate.getYear(); //获取当前年份(2位) 2 myDate.getFullYear(); //获取完整的年份(4位,1970-????) 3 myDate.getMonth(); //获取当前月份(0-11,0代表1月) 4 myDate.getDate(); //获取当前日(1-31) 5 myDate.getDay();

20.5 Shell脚本中的逻辑判断;20.6 文件目录属性判断;20.7 if特殊用法;20.8 20.9 cace判断(上下)

扩展: select用法 http://www.apelearn.com/bbs/thread-7950-1-1.html 20.5 Shell脚本中的逻辑判断 格式1:if 条件 ; then 语句; fi 1. 创建if1.sh测试脚本: [[email protected] ~]# vi if1.sh a=5,如果a大于3,满足这个条件,显示ok 添加内容: #!/bin/bash a=5 if [ $a -gt 3 ] then echo ok fi 2. 执行if1.sh脚本: [[e

20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量

20.1 Shell脚本介绍 1. shell是一种脚本语言 aming_linux blog.lishiming.net 2. 可以使用逻辑判断.循环等语法 3. 可以自定义函数 4. shell是系统命令的集合 5. shell脚本可以实现自动化运维,能大大增加我们的运维效率 20.2 Shell脚本结构和执行 1. 开头(首行)需要加: #!/bin/bash 2. 以#开头的行作为解释说明: 3. 脚本的名字以.sh结尾,用于区分这是一个shell脚本 4. 执行.sh脚本方法有两种:

shell 中seq的用法 echo -n用法

用法:seq [选项]... 尾数 或:seq [选项]... 首数 尾数 或:seq [选项]... 首数 增量 尾数 从1循环到100的两种方法(bash 其它的shell没试过)for x in `seq 1 100`;do echo $x;donefor x in {1..100};do echo $x;done echo -n 不换行输出 $echo -n "123" $echo "456" 最终输出 123456 echo -e 处理特殊字符 若字符串中

sudo的用法

su -l user -C 'COMMAND' 是用user这个用户执行命令 我们一般使用sudo 这个命令 sudo [-u] user COMMAND sudo [-k] COMMAND 清除此前用户的密码. sudo的配置文件/etc/sudoers 配置项为 users    hosts=(runas)    commands users:可以是一个用户的名称也可以是一个组,也可以是一个别名 username #UID user_alias 用户别名的用法 User_Alias NETA