constexpr 函数

constexpr 函数 — C++ 20

constexpr double pi = 3.14;

constexpr允许你在编译时使用典型的C++函数语法进行编程,但这并不意味之constexpr只和编译期有关

constexpr函数可以在编译期运行,也可以在运行时运行

但在以下情况constexpr函数必须在编译期运行:

  • constexpr函数在编译的上下文中需要,比如数组初始化,类型萃取库,断言表达式
  • constexpr函数的值被constexpr的值需要,比如constexpr int a = func();

与模板元编程相似

image-20220531223244872

  • 模板元程序一定在编译期运行,但是constexpr函数可以在编译期或运行时运行
  • 模板元程序的参数可以使类型,非类型,模板
  • 编译期是没有状态的,这意味着模板元程序是纯粹的函数式风格
    • 在模板元程序中,不会修改值,只会在每次返回值
    • 在编译期,实现一个循环所需要的可变变量是不可能实现的,所有的循环都依赖递归
    • 在模板元程序中,条件执行都被模板的特化取代

对比

  1. constexpr参数与模板元函数的参数对比

image-20220531224725257

  1. constexpr函数可以有可变的变量并修改,但是模板元函数无

image-20220531225041140

  1. 模板元函数使用递归模拟循环

image-20220531225139346

  1. 模板元函数使用专门化或者模板结束循环

image-20220531225443877

  1. 模板元函数不会修改变量,而是在每次递归中返回一个新值

image-20220531225615714

  1. 模板元函数没有返回值,直接使用值作为返回值

image-20220531225746373

实例化

template <typename T>
bool isSmaller(T fir, T sec)
{return fir < sec;
}int main(int argc, char* argv[])
{isSmaller(5, 10); // (1)std::unordered_set<int> set1;std::unordered_set<int> set2;isSmaller(set1, set2); // (2)	
}
  1. 检查模板语法,通常由编译器完成
  2. 为每个不同类型的模板参数实例化一个模板函数,第二个函数会失败,因为std::unordered_set<int>不支持<

constexpr与此相似


什么是函数式编程思维? - 用心阁的回答 - 知乎 https://www.zhihu.com/question/28292740/answer/40336090

么是函数式编程思维? - 用心阁的回答 - 知乎 https://www.zhihu.com/question/28292740/answer/40336090

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/407970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

constexpr和consteval --- C++ 20

constexpr和consteval — C 20 标准库容器和算法库对constexpr 的应用 C20 中大量的算法和容器可以使用constexpr,这意味着你甚至可以再编译期vector<int>进行排序 Algorithms library - cppreference.com 如下: #include <iostream> #include <ranges>…

函数模板(参考《C++ Templates 英文版第二版》)

函数编程(参考《C Templates 英文版第二版》) Chapter 1 函数模板 1.1 一窥函数模板 template<class T> T max(T a, T b) {return b < a ? a : b; }#include "max1.hpp" #include <iostream> #include <string> #include <format>int…

Curiously Recurring Template Pattern奇怪的模板递归 --- C++20

Curiously Recurring Template Pattern 奇怪的模板递归 — C20 我们都知道C有静态多态和动态多态,动态多态通过虚函数表实现,他的缺点就是对效率产生一点点影响 可以用CRTP解决这个问题 我们先举一个动态多态的例子: #include <iostream> using namespace std;class …

PROJECT #0 - C++ PRIMER [CMU 15-445645]笔记

PROJECT #0 - C PRIMER [CMU 15-445/645]笔记 这是数据库领域的一门课程, 由卡内基梅隆大学副教授Andy Pavlo授课, 目前在网上有授课视频资料、实验以及配套的在线测评环境 (限时开放至2021年12月31日) 环境: wsl2 Clion Project #0 - C Primer 还是很简单的,主要目的是让…

简单JS实现对表的行的增删

这段代码非常的简单&#xff0c;仅仅作为自己的一个小小的记录&#xff01; ok&#xff0c;先上一个简单的图例&#xff0c;效果如下&#xff08;注意&#xff1a;这只是一个简单的例子&#xff0c;不过可以根据这个简单的例子&#xff0c;变化出更为复杂的效果&#xff09;&am…

Yii权限管理工具Srbac使用小结

一、关于Srbac Srbac是基于Yii 框架的 RBAC&#xff08;基于角色的访问控制&#xff09; 插件模块&#xff0c;用于帮助Yii开发人员更方便地进行权限控制&#xff0c;在实际应用过程中也比较方便。 二、安装配置Srbac 在Yii的官方网站的Extensions中已经收录了Srbac插件&#x…

概念concept和requires ---C++ 20

概念concept和requires —C 20 concept concept简化了模板编程的难度 我们可以使用**concept定义模板形参的约束条件T** 模板实力替换T后必须满足std::is_integral_v<C>;为true 例子: requires关键字可以直接约束模板形参T 如下: template <class C> concept …

向DataGridView中添加新的一行数据,可以添加到最后一行或作为第一行

我的开发环境&#xff1a;Microsoft Visual Studio .net 2005 这个程序是Windows Forms Application 新建一个Windows Forms Application项目&#xff0c;打开Form1&#xff0c;在窗体上放一个DataGridView控件和Button,在DataGridView的Columns中添加两列&#xff0c;Name分别…

DataGridView添加一行数据、全选、取消全选、清空数据、删除选中行

.net 2005下的Windows Form Application,一个DataGridView控件和4个Button&#xff0c;界面设置如下&#xff1a; 代码如下&#xff0c;有注解&#xff0c;相信大家都看得明白&#xff1a; using System;using System.Collections.Generic;using System.ComponentModel;using S…

类型萃取类型检查 Type-Traits LibraryType Checks --- C++20

类型萃取:类型检查 Type-Traits Library:Type Checks — C20 Type-Traits library 在C11的时候就已经发布,但依然随着C版本在不断更新 类型检查 Type Checks 每种类型就是十四种主要类型之一 主要类型 template <class T> struct is_void; template <class T>…

模板元编程 Template Metaprogramming--- C++ 20

模板元编程(一) Template Metaprogramming— C 20 在编译期进行类型操作 举个例子: std::move在概念上应该这样实现(实际并不是这么做的): static_cast<std::remove_reference<decltype(arg)>::type&&>(arg);意义上,std::move首先获取它的参数arg,推断…