C++

[C++]C++20対応のインタプリタを使いたい。Clingの導入。

C++

C++20に対応したインタプリタを使ってみた話。CERNのROOTというデータ分析ツールのプロジェクトチームが同時にClingというC++インタプリタを開発しており、これを導入してみた話である。ClingはLLVMに基づくインタプリタであり、公式にはClangにできることは…

[C++]データ処理、分析のためのライブラリ制作。

1. はじめに 以前からブログやX(旧Twitter)でしばしば触れていることではあるが、私はC++でデータ集計や分析をするためのライブラリを制作している。今回、そのライブラリの最新版がいくらか動作するようになったので、GitHubでの公開とともにこのブログで…

[C++]非constexpr関数の引数からconstexpr関数をコンパイル時に評価させたかったのに。

C++

例えば次のような関数があるとする。 constexpr int multiply(int a, int b) { return a * b; } inline int func(int a, int b, int c) { return a + multiply(b, c); } int main() { int a = 1; std::cout << func(a, 2, 3) << std::endl; return 0; } この…

[C++]Nullポインタ経由のstaticメンバへのアクセスは許されている。らしい。

C++

nullポインタに関するメモ。 あるクラスのポインタを経由してそのメンバにアクセスしたい場合、通常はそのポインタがnullポインタであってはならない。しかしnullポインタであったり、有効なアドレスでなかったりした場合にも、staticメンバへのアクセスに利…

[C++]フォーマット動的解析を行わないsscanfっぽい関数は速いのか。

C++

一年以上ぶりのC++記事であるが、緩めの内容。研究の方で一つ山場を乗り切ったので、気分転換にちょっと遊んでみた結果である。 動機 以前、巨大なテキストファイルの読み出しを並列化する記事を書いたことがある。CSVやSSVのように、ある程度統一されたフォ…

[C++][Qt]windeployqtをCMakeから実行する。

動機 オープンソース版のQtは基本的にLGPLライセンスであるため、ライセンスの汚染を避けるためには動的リンクが必要になる。この場合、何らかのアプリケーションを作って配布するときは、Qtの関連する共有ライブラリなどをアプリケーションに同梱して配布す…

[C++]ふと文字列リテラルによる名前付きtupleが欲しくなった話。

C++

何らかのクラスをタグとして与えるtuple、なら作る方法はネット上にいくらでも転がっているが、タグ用のクラスをいちいち宣言しなければならないのが鬱陶しいし、名前空間を汚してしまうのも気になるので、文字列リテラルで与えられるようにできないかなぁと…

[C++]アロー演算子オーバーロードでtuple、pairその他一時オブジェクトを返したい場合。

C++

久々の投稿だけど小ネタ。独自クラスのイテレータを設計しているときにちょっと悩んだので。 例えば何らかのイテレータを作っていたとして、そのイテレータの間接演算子が参照型ではなく、何らかの一時オブジェクトを返すものだったとする。 struct iterator…

[C++][vcpkg]vcpkgのパッケージバージョン管理、レジストリ編。

本頁の内容はvcpkgの非常に新しい機能についての説明で、正確な説明のなされた公式ドキュメントが著しく不足していることもあり、完全に手探りで書いています。他の環境やパッケージで動く保証も、また将来に渡り同じ方法が通用する保証もありません。私には…

[C++][vcpkg]vcpkgのパッケージバージョン管理、マニフェストモード編。

はじめに vcpkgはクラシックモードとマニフェストモードの2種類の動作があるようだ。クラシックモードはvcpkgの日本語解説でもよく説明されている、以下のようにパッケージを一つ一つ指定してインストールしていく方法である。 vcpkg install opencv3:x64-wi…

[C++][CMake]複数のコンポーネントから成るパッケージを作りたい時。

動機 多数のライブラリを含む自作のパッケージを、find_packageで他のプロジェクトからコンポーネント単位で利用できるようにしたかった。 つまり例えば次のように、ある自作のパッケージ(mylib)が複数のライブラリ(lib1、lib2、lib3)を持っており、その中か…

[C++][vcpkg]vcpkgに関する備忘録。

疑問が解決する度に追記していきたい。基本的にWindowsで使用することを想定している。 デフォルトのtripletを変更する 環境変数VCPKG_DEFAULT_TRIPLETの値を任意のtripletにすればよい。いちいちpackage名のあとにtripletを入力する手間が省ける。 個人的に…

[C++][Qt]Qtのsignals、slotsなどのマクロ名が衝突するとき。

Qtに関する備忘録。 サードパーティーのライブラリなどではsignals、slotsのような名前が何かしら使われていることは珍しくないが、Qtはこれらの名前のマクロを持っているので、採用するライブラリによっては名前の衝突によってコンパイルできなくなることが…

[C++]日時、任意の数値型、任意の文字列、任意のrangeに対応させた。Gnuplotライブラリ更新(4)。

github.com 更新内容 これまでプロットに使えるデータ型はdoubleまたはstd::stringのみだったが、これをstd::is_arithmetic_v<T>またはstd::is_convertible_v<T, std::string_view>を満足する任意の数値型、任意の文字列型へと拡張した1。 データ配列の形式としてはstd::vectorのみが</t,></t>…

[C++]std::any_castせず格納されたオブジェクトを扱えるようなstd::anyは作れるか。

C++

以前作った実行時ジェネリクスのためのAnyは自由度を高め可変長引数や完全転送に対応させるために非常に入り組んだ設計になってしまったので、ずっと簡単でC++初級者にも分かりやすい設計にしてみようという試み。拘り過ぎると自分にとっては便利でも他人に…

[C++]std::ranges::views::zip、enumerateの代替機能を作ってみる。

C++

※本記事の内容はC++20の<ranges>を全く理解できていない人間が手探りで書いたものです。参考にするのは構いませんが鵜呑みにしないでください。 私はまだC++20を導入していないのだが、時代に取りに越されないために最低限の使い方を理解すべく、<ranges>で遊んでいる。ただ</ranges></ranges>…

[C++]<ranges>のstd::viewsと同様に扱えるviewを自作する。

C++

※本記事の内容はC++20の<ranges>を全く理解できていない人間が手探りで書いたものです。参考にするのは構いませんが鵜呑みにしないでください。 本記事はこの次の記事(C++20に入らなかったzip、enumerateの代替機能)の下準備である。あれをstd::viewsに対応させる</ranges>…

[C++] std::anyが動的メモリ確保を行うとき、行わないとき(msvc)。

C++

std::anyとは std::anyはどのような型のオブジェクトでも格納することが出来、デストラクタも勝手に呼んでくれるなかなか便利な機能である。C++17で導入されたType Erasureの一つだ。 この機能は一体どうやって実現しているのだろうか。規格に沿っているかど…

[C++]数式パーサーADAPT-FMPは本当にExprTkより速いのか。

自作ライブラリの話。 以前、ADAPT-FMPという文字列数式計算を行うためのライブラリを公開したのだが、自称世界最速と豪語したくせに、本当にそう名乗れるだけの性能があるのか計測したことがなかったので、ベンチマークを行うことにした。私の知る限りこの…

[C++]Boost.PFRの実装の解説のような。

動機 Boost 1.75.0からPFRが追加された。通常の構造体のメンバ変数に対してあたかもstd::tupleであるかのようにget<N>でアクセスできる、という謎機能ライブラリである。 このようなライブラリの存在は以前から知ってはいたのだが、白状すると、その機能を知っ</n>…

[C++]Visual StudioからClangを使うときに膨大な警告が出る。

問題 タイトルのとおり。オプションに与えているのは-Wallのみのはずだが、何故か-Wallでは出るはずのない警告が大量に発せられるのだ。 警告の内容は、C++98と互換性のないコードだとか、コンマ演算子の使い方に文句をつけられたりとか、static変数にいちゃ…

[C++]std::tupleのコンストラクタとstd::anyに関する豆知識。

C++

問題 次のコードを実行するとどうなるか? #include <iostream> #include <cstdlib> #include <tuple> #include <any> void print(const std::any& a) { if (a.type() == typeid(int)) std::cout << "any contains int" << std::endl; else if (a.type() == typeid(std::tuple<int>)) std::cout <</int></any></tuple></cstdlib></iostream>…

[C++]型情報を保持する汎用参照と、関数テンプレートでなくてもできるジェネリクスもどき。

C++

任意の型の参照を受け取ることのできる型が欲しい、と思ったことはないだろうか。例えば関数テンプレートに出来ない仮想関数で、引数に何が与えられるか分からないとき、どんな型であろうととりあえず参照で受け取ることができればと思ったことはないだろう…

[C++]一時ファイル生成を不要に。Gnuplotライブラリ更新(3)。

以前から公開しているC++用GnuplotライブラリADAPT-GPM2に対して、estshorter様から新機能のプルリクエストを頂きめでたくマージされたので、その情報+αを書き留めておく。 簡潔に言うと、Gnuplotにプロットするデータを送るために、従来は一時ファイルが作…

[C++]フォーマット指定が不要なfprintf関数のような何か。

C++

いちいちフォーマット指定しなくても、適当にフォーマットを生成してそれっぽく出力してくれるPrint関数を作った。……すげぇしょうもないもんを作ってしまった。 いや、その、訳あってFILE*とstreamを使い分ける必要が生じたのだ。特にフォーマットらしいフォ…

[C++]テキストファイルの読み込みを並列化するサンプル。

C++

※最近本ブログが「モダンC++を扱うブログ」として取り上げられ多くの人が訪問してくれていますが、普段の私はこんな感じの緩い記事ばかり書いているので、どうか過度に期待されないようお願いします。 動機 テキストファイルは普通、どんなに大きくてもMB単…

[Qt][C++]QLineEdit編集中に常にPopupした状態になるWidgetを作る。

開発中のSlack過去ログビューワについての備忘録。アプリケーション本体は近日中に公開する。 あのアプリケーション中では、検索ボックスがクリック、文字入力等されている時は常にすぐ下に検索オプションを表示させるようにしている。が、この実装がそれは…

[C++]SFINAEとC++20のコンセプトを比較してみる。

C++

C++のテンプレートが大好物な私は以前から話題になっていたコンセプトとやらにもそこそこ興味を持っている。コンセプトとはざっくり言えば、今までSFINAEを使って実現していたテンプレートパラメータに対する制限やオーバーロードを、もっと分かりやすく実現…

[C++]自称世界最速の文字列数式計算ライブラリを作った。

更新情報 2021年1月 C++標準への要求をC++14からC++17に変更しました。 ベクトル、行列をadapt::Vector<double>、adapt::Matrix<double>からEigenのVectorXd、MatrixXdに、文字列をadapt::Stringからstd::stringに変更しました。 上の変更に伴い、線形代数ライブラリEigenを</double></double>…

[C++]enumを文字列に変換する汎用的な方法。

C++

2021年9月28日追記。どういうわけかアクセス数が増えているので、訪問者を混乱させないよういい加減だったサンプルを作り直した。 enumは単なる整数値に名前を付与する手段の一つだ。パラメータの意味がわかりやすくなる上、処理コストの大きな文字列を使わ…