随笔分类 - C/C++
摘要:科学计算当中会用到不少浮点数的操作,这些浮点数可能是16位,32位,64位,80位甚至是128位。开源项目SoftFloat提供了一个高效的浮点运算实现,可以在没有硬件支持的情况下,高效模拟浮点数的各种操作。 那么,浮点数之间的比较,基本运算这些究竟是怎么实现的呢,可以拿32位浮点数作为例子。 这是
阅读全文
摘要:说起模板元编程,估计不少人的第一反应都是充斥着各种递归的奇技淫巧,没错,这次我们就来对模板元这种屠龙之术进行初步窥探,看看能玩出什么花样出来。 小试牛刀 template <typename _Tp, typename... args> struct get_size { static conste
阅读全文
摘要:C++作为一门静态类型语言,是需要程序员声明变量类型的。然而来到了C++11,auto的诞生使得变量声明变得及为方便,尤其是对于比较长的模板类型,auto一定程度上为代码编写者减轻了负担。到了C++23,突然来了个新特性:auto{x}/auto(x),这又是个什么东西,它的motivation又是
阅读全文
摘要:在此之前,先来回顾元编程当中的一个重要概念。 template<typename _Tp, _Tp __v> struct integral_constant { static constexpr _Tp value = __v; typedef _Tp value_type; typedef in
阅读全文
摘要:Generic Types of Ranges 类型萃取从字面意思上来说其实就是帮助我们挑选某个对象的类型,筛选特定的对象来做特定的事。可以先来回顾一下以前的写法。 #include <vector> #include <iterator> int main() { std::vector v{1,
阅读全文
摘要:using for Enumeration Values 对比一下C++20前后的区别: enum class State { open, progress, done = 9 }; // Before C++20 void print(State s) { switch (s) { case St
阅读全文
摘要:C++11起,引入了基于范围的for循环这一特性,有什么好处呢?它有时可以大大地简化遍历容器的操作,比如说STL的vector。 std::vector v{1, 2, 3}; std::vector<int>::iterator it = begin(v); for (; it != end(v)
阅读全文
摘要:设计一个不能被using的对象 在实际开发中为了避免命名空间污染,一般都不会using namespace std。但是如果一个对象写起来比较复杂,用using能大幅度地简化操作。现在假设我们要设计一个函数,它在一个作用域里面,使用它只能以A::B::C()这种形式。思考一下,如果我们放在命名空间下
阅读全文
摘要:假如我有一个需求,就是如果传入的参数是int类型,我就输出int类型,否则就输出T。很显然,根据模板的基础知识,我们可以这么写 template <class T> void f(T) { std::cout << "T\n"; } template <> void f(int) { std::co
阅读全文
摘要:注释掉的为传统的写法,从C++20起支持default关键字修饰的写法,即使是成员变量有多个的时候也支持,减轻了程序员的心智负担。
阅读全文
摘要:#include <iostream> #include <vector> #include <numeric> #include <sstream> int main() { std::vector v{1, 2, 3, 4, 5}; std::copy(begin(v), end(v), std
阅读全文
摘要:以下代码为修改vector内部的每一个元素,使其每个元素大小变为原来的平方。 std::vector v1{1, 2, 4, 2}; std::for_each(begin(v1), end(v1), [](auto& n) { return n * n; }); for (const auto&
阅读全文