WindowsOS環境のHRESULT型エラーコードからエラーメッセージ文字列へのお手軽変換。Microsoft Visual C++(MSVC)限定。 #include <windows.h> #include <system_error> std::string get_message(HRESULT hr) { return std::system_category().message(hr); } // GetLastError()戻り値な</system_error></windows.h>…
プログラミング言語C++標準規格に潜む恐竜たち。C++20(N4861) D.5 Deprecated volatile typesより引用。*1 1 Postfix ++ and -- expressions (7.6.1.5) and prefix ++ and -- expressions (7.6.2.2) of volatile-qualified arithmetic and pointer types are…
C++20 RangesライブラリのRangeとViewとconst修飾の関係についてメモ。まとめ: 対象Rangeのconst修飾(要素の変更可否)と、Viewのconst修飾(const-iterableの可否)は異なる概念である。 C++20標準ライブラリ提供の一部Rangeアダプタでは、const修飾によ…
C++20 Rangesライブラリの逆順ビューstd::ranges::reverse_viewおよびRangeアダプタstd::views::reverse*1についてメモ。 基本の使い方 範囲for構文とRangeアダプタreverseを組み合わせて、配列や文字列やコンテナなどRangeとして扱えるものを逆順に列挙でき…
次期C++2b(C++23) Rangesライブラリstd::views::splitとstd::string_viewを利用した文字列分割処理。C++標準ライブラリのアップデートによりC++20時点よりシンプルに記述可能となり、またstd::stringを介さないため実行効率改善も見込める。 // C++2b(C++23)…
Androidでは初代デス・スター(Death Start I)の重力加速度定数が提供される。Android API Level 1からの超古参。 public static final float GRAVITY_DEATH_STAR_I Gravity (estimate) on the first Death Star in Empire units (m/s^2)Constant Value: 3.53…
プログラミング言語C/C++のそれぞれ次期バージョンC2x(C23)/C++2b(C++23)では、新しいプリプロセッサディレクティブ#elifdefと#elifndefが追加される予定。*1 #ifdef identifier:#if defined(identifier)と等価 #ifndef identifier:#if !defined(identifie…
プログラミング言語C++標準規格の索引(Index)に紛れ込むジェームズ・ボンド。 [expr.prim.lambda] Add index entry for example of *this capture. https://github.com/cplusplus/draft/commit/703d892264af814a64140b17ffe2bf6ae9274dde 関連URL https://tw…
タイトル通り。ISO/IEC JTC1/SC22/WG14サイト各種文書への短縮リンク提供サービス。 wg14.link/nXXXX Get document.wg14.link/{c99,c11,c18,c2x} Get latest working draft. https://wg14.link/ 関連URL WG21 redirect service - yohhoyの日記
2020年11月 OpenMP 5.1仕様リリース記事 OpenMP ARB releases OpenMP 5.1 with Vital Usability Enhancements より抄訳。OpenMP仕様バージョン5.1はOpenMP ARB、主要なコンピュータハードウェア/ソフトウェアベンダのグループ、そしてOpenMPコミュニティの…
C++20 制約式(constraint-expression)でテンプレートパラメータに依存する定数条件式condを表現する場合、非定数式に起因するハードエラーを防ぐためstd::bool_constant<cond>::valueと記述する必要がある。 #include <type_traits> struct X { // X::valueは非定数式 static in</type_traits></cond>…
プログラミング言語Cの次期仕様C2x(C23)では 2進数リテラル(binary literal) が正式仕様となる。そこ今更とか言わない。 // C2x unsigned x = 0b101010; unsigned y = 0B11110000; ノート:2003年時点の (PDF) Rationale for International Standard Program…
C++標準ライブラリstd::is_convertibleメタ関数とstd::convertible_toコンセプトの超微妙な違い。本記事の内容はStackOverflowで見つけた質問と回答に基づく。要約: is_convertible<From, To>メタ関数:From型からTo型へ暗黙変換できることを検査する。 convertible_to<From, To></from,></from,>…
C++20 requires式(requires-expression)の単純な利用では非static/staticメンバを区別できない。requires式の本体部は評価されない(unevaluated)ため、通常コードとは異なる規則が適用されることに注意。 // staticメンバmを持つ型X struct X { static cons…
C++20標準ライブラリで導入された Customization Point Object (CPO)定義で必要となる Poison-pill*1 オーバーロードについてメモ。std::ranges::swapやstd::ranges::begin/endなどのCPO定義で利用される。本記事の内容はStackOverflowで見つけた質問と回答…
N要素からなるサブシーケンス検索を行うC++標準アルゴリズムstd::search_nでは、“0個の任意要素からなるサブシーケンス” は常に先頭位置にマッチする。 #include <algorithm> int arr[5] = {0, 10, 10, 20, 30}; // 2個の要素10からなるサブシーケンス auto itr1 = std:</algorithm>…
C++20コンセプトで導入されたrequires節と、テンプレート特殊化の組み合わせには注意が必要。例えば制約付きプライマリテンプレート(#1)に対してdouble型で明示的特殊化(#2)しようとしても、下記記述コードでは#2定義でill-formedになる。これは#1のrequires…
Intel oneTBB(oneAPI Threading Building Blocks)によるC++並列プログラミングの電子書籍。PDF形式(754頁)がCC-NC-ND 4.0ライセンスで公開されている。 Pro TBB C++ Parallel Programming with Threading Building Blocks, Michael Voss, Rafael Asenjo, Jam…
C++2a(C++20)コンセプトにおける原始制約(atomic constraint)では、パラメータ置換(parameter mapping)の失敗はハードエラー(ill-formed)を引き起こさず、その制約式を満たさない(not satisfied)と解釈される。C++17現在はstd::void_tやstd::conjunctionを駆…
C++2a(C++20)コンセプトの制約式(constraint-expression)では、論理演算&&, ||は短絡評価される。*1C++17現在のテンプレートメタプログラミングではstd::conjunction, std::disjunctionメタ関数を必要とするが、C++2aコンセプト導入により自然な制約記述が可…
プログラミング言語Pythonにおいて、関数やラムダ式にローカル変数の「値」を束縛する方法。下記コードでは “引数xを定義時の値nで冪乗” する関数を個別生成するつもりが、実際には “引数xを変数nの値で冪乗” する同一の関数が生成される。forループ終了後の…
C++標準ライブラリstd::functionのムーブ操作(ムーブコンストラクタ/ムーブ代入演算子)は保持する呼出し可能なオブジェクト(callable object)を必ずしもムーブせず、条件によってはコピーが行われる可能性がある。( ゚Д゚)ハァ?C++標準ライブラリ仕様ではstd:…
C++17標準ライブラリで導入されたstd::functionクラステンプレートの推論ガイド(deduction guide)についてメモ。 #include <functional> // 関数ポインタから推論 int f(int n) { return n; } std::function f1 = f; // OK: function<int(int)> // ラムダ式から推論 std::function </int(int)></functional>…
C++2a(C++20) Rangesライブラリstd::views::splitを利用した文字列分割処理。*1 2021-06-24追記:次期C++2b(C++23)標準ライブラリではよりシンプルな実装が可能となる。split2str関数は「char範囲を区切り文字delimで分割しstd::stringのViewへ変換するレン…
C++2a(C++20)標準ライブラリ<numbers>では、変数テンプレート(variable template)*1により浮動小数点型(float, double, long double)にあわせた数学定数を提供する。一方、浮動小数点型以外によるプライマリテンプレート利用はill-formedとなることが要請されている。</numbers>…
C++標準ライブラリに含まれるC標準ライブラリヘッダ*1と、std名前空間との関係についてメモ。C++11以降では、下記の振る舞いが保証される: ヘッダcxxx: 名前空間stdにCライブラリの識別子が宣言される。グローバル名前空間にも宣言されるかもしれない。 ヘ…
C++2a(C++20)で導入されるrequires節を用いた関連制約(associated constraints)により従来SFINAE技法よりも関数テンプレートのオーバーロード制御が容易となるが、戻り値型にSFINAE-unfriendlyなメタ関数を用いるケースでは意図しないコンパイルエラーを引き…
C++2a(C++20)で導入される三方比較演算子(three-way comparison operator)<=>(通称:宇宙船演算子(spaceship operator))と、C言語時代の関数インタフェースでよくみられる三方比較結果 “負値/値0/正値” との組合せ利用について。新旧仕様の橋渡し。例え…
プログラミング言語Rustのtodo!マクロとunimplemented!マクロの違い。 todo!:作業途中のコード。あとで実装する。 unimplemented!:現行コードでは未実装(実装するとは言っていない) The difference between unimplemented! and todo! is that while todo…
C++2a(C++20)コンセプト requires式(requires-expression) に記述する 複合要件(compound-requirement) では「ある式の評価結果が特定コンセプトを満たすこと」を制約するが、このとき標準コンセプトstd::same_as/std::convertible_toを適切に使い分ける必…