C++ 17/20 的一些數值函式庫

這篇是延續之前的《C++11 的一些數值函式庫》,繼續來整理 C++17C++20 在數值函式庫上的變化。

首先,在 <numeric> 這個 header 裡面(參考),又加入了很多 template 函式可以使用,其中也包含了 gcd(對大公因數)、lcm(最小公倍數)、inner_product(內積)等等;雖然不能說沒用,但是老實說,有需要的人大概都已經有自己的方案了吧…

另外,這次也還有支援平行化reduce(),以及在平行化演算法裡面很常見的 inclusive_scan()exclusive_scan() 可以使用。

閱讀更多»

C++ 20 Ranges

目前 C++ 最新的正式標準、C++ 20 在去年年初就已經正式定案了,當時 Heresy 也有稍微記錄過;其中,也有針對 conceptstemplate lambda 稍微紀錄了一下自己玩的想法。

這篇呢,則是來看一下 C++ 20 的 Ranges 這個新的函式庫吧~

C++20 的 ranges 這個函式庫(CppReference),基本上是針對一組範圍的資料來做處理的函示庫,重點是提供了本身不擁有資料的「view」、以及用來快速串聯操作的「view adapter」的架構。

由於 view 本身基本上都是採用使用 iterator 來做存取的概念,所以在個人來看,應該可以算是 C++ containter(vector 這些)的一個延伸。

閱讀更多»

C++20 的 template lambda

C++11 所推出的 Lambda expression 這種匿名函式,Heresy 一開始還覺得不知道哪裡可以用?但是後來真正寫多了,才發現他實際上是非常好用的一個功能。

而在 C++14 / C++17,也又針對 lambda 加入了一些新的功能、讓他更為強大。
不管是 captures with an initialiser 還是 generic lambda,都讓 lambda 的使用上更為方便。

到了 C++20,則是又加入了「template parameter for lambda」這項特性,算是又做了一些強化。

閱讀更多»

C++20 concepts:定義的方式(part 2)

在前一篇《template 型別的需求描述:C++20 concepts(part 1)》,基本上算是簡單介紹了一下 Heresy 知道的 C++20 concepts 的使用概念。

而怎麼制定自己需求的 concept 呢?這邊來稍微整理一下。

首先,C++20 有提供 <concepts> 這個函式庫(參考),提供一些常見的概念,可以來直接使用。而實際上,裡面有很多是使用 C++11 的 <type_traits>(參考)的功能來做的;如果要自行定義 concept 的話,<concepts> 和 <type_traits> 應該都是有幫助的。

Concept 的語法基本上如下:

template<template_parameter_list>
concept concept_name = constraint_expression;

閱讀更多»

template 型別的需求描述:C++20 concepts(part 1)

Template 是 C++ 一個泛型的重要功能。透過 template 可以讓開發者只要寫一次,就可以針對不同的型別的資料,來做處理。

他雖然用起來很方便,但是大部分情況下都缺少對於需求型別的描述,所以如果沒用好寫錯了,就很有可能因為使用了不符合需求的型別,而導致無法正確編譯;而這個時候,編譯器給個錯誤訊息往往也會過於雜亂、讓開發者難以理解、也難以找到真正的問題點。

比如說下面這個簡單的範例程式:

閱讀更多»