2020-01-01から1年間の記事一覧

[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++

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

[SlackLogViewer]Slack過去ログ閲覧ツール更新(1)。

タイトルの通り、SlackLogViewerをver-1.1.Beta-1に更新した。ツールの詳細については以前の投稿記事を参照されたい。ツールのダウンロードはGitHubのReleaseから。SlackLogViewer.v1.1.Beta-1.zipというファイルをダウンロードして解凍すれば良い。 更新箇…

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

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

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

C++

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

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

C++

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

twitterでバズる人の気分は多分こんな感じなんだろう。

このブログがある方によって「モダンなC++を扱うブログ」の一つとして取り上げられたことで、アクセス数が突然激増してしまうという事態に見舞われた。何気なくアクセス解析を開いたら数字が普段の十倍くらいに跳ね上がっていたものだから何事かと思って、ど…

Slackの消えてしまった過去ログの閲覧ツールを作った。

以前から作っていたSlack過去ログ閲覧ツールSlackLogViewerを公開してみる。Wiindows、Mac用にはGitHubでビルド済みの状態でも配布している。Slackフリープランの10000件または90日制限への対策である。詳細は使い方の説明を。 macOS版がm1などApple Silicon…

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

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

jsbookをjsreportっぽいレイアウトにするには。

私は学位論文用としてはjsreportのデフォルトのレイアウトが気に入っていたのに、jsreportでは一点だけ満足できなかった。ヘッダーである。偶数ページには章題、奇数ページには節題を表示したかったのに、それがどうにも上手くいかなかったのだ。一般にはfan…

[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>…

CMake-guiが起動しなくなったときの対処。

Windows10でCMake-guiを使っているのだが、ある日突然どういうわけか起動しなくなった。タスクバーにはCMake 3.16.4というボタンがアイコン付きで表示されるが、ウィンドウが現れないのだ。CMakeの再インストールを行っても直らない。これは3.18.0にアップデ…

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

C++

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

[C++]Gnuplotライブラリを各軸の文字列表示に対応させた。Gnuplotライブラリ更新(2)。

タイトルのとおりである。GitHubで公開しているGnuplotライブラリADAPT-GPM2を、以下の図のように、軸を数値ではなく文字列にできるようにした。 #include <ADAPT/GPM2/GPMCanvas.h> using namespace adapt::gpm2; int main() { std::vector<std::string> x; std::vector<double> y; x.push_back("label-on</double></std::string></adapt/gpm2/gpmcanvas.h>…

[C++]std::decayの役割。

C++

std::decayは放射性のstd::atomicを非放射性へと変換するための機能である(嘘)1。 std::decayはよくわからない機能である。標準ライブラリの実装などを見ていると結構な頻度で見かけたりするのだが、一体何を目的に使用されているのかはすぐには理解できな…

[C++]関数の引数として受け取る固定長配列の長さは指定可能である。

C++

先の記事で配列型の扱いをいろいろ考えていた中で、ふと気がついた。一般に配列を受け取る関数は、配列引数を先頭要素へのポインタの形で受け取らざるを得ず、その配列の要素数を指定できないと思われている。確かに今や枯れ果てたC言語ではそうだった。が、…

[C++]テンプレートによる配列の扱い。std::anyは配列を格納できるのか。

テンプレートは配列型をどのように推定するのか。 C++のテンプレートを使っていて稀に遭遇する問題の一つは、配列の取り扱いである。私はC言語時代の配列を毛嫌いしていて基本的にstd::arrayを使うようにしているのでこの問題には滅多に引っかからないのだが…

Tensorflowによる連続値推定。

Tensorflowの最終的な出力が、分類ではなく何らかの連続値であってほしい場合がある。世間ではDeep Learning = 画像分類みたいなイメージが定着しているためか、サンプルを探してもそのようなものばかりであるが、連続値推定も可能である。例えば素粒子実験…

[C++]Visual Studio 2019でatl***.hが見つからない問題に対処する。

症状 最近Visual Studio 2019へと環境を移したのだが、これの上でプラットフォームツールセットをVisual Studio 2017(v141)に切り替えてビルドしようとすると、ATL(Active Template Library)がエラーを発するようになった。タイトルのように"atlstr.h"など…

FirefoxでSide Viewの幅の制限を取り払う方法。

Firefoxのアドオンの中にSide Viewというものがある。通常Firefoxのウィンドウ内には一つのページしか表示できないのだが、Side Viewを追加するとサイドバーに別のページを表示させることができ、実質的な画面分割機能として役に立つ。ただし単に導入しただ…

Visual Studio Codeで、言語ごとに折り返しなどを設定する。

最近Visual Studio CodeでLaTeX編集を始めたのだが、VSCodeはデフォルトでは折り返しがOffになっている。「表示->折り返しの切り替え」をチェックしても、これは一時的な変更でしかないので、VSCodeを終了すると元に戻ってしまう。しかも「設定->よく使用す…

[C++]std::coutやstd::stringをprintf風にフォーマットする。

C++

私はstreamが嫌いである。scanf、printf系の関数を使うほうがよほど分かりやすく間違いも生じにくいと勝手に思っている。特にiomanipを使ったフォーマットは最悪だ。あんな記述コストが大きくて分かりにくい仕組みをどこの阿呆が考えやがったのか。 C++20か…

[C++]QFileDialogで最後に開いたフォルダ。

QFileDialogは最後に開いたフォルダを保存しておき、次にダイアログを開いた時は最初からそのフォルダを開くようになっている1。この“最後に開いたフォルダ”は全てのQFileDialogのインスタンスで共有されているので、その情報はstaticメンバないしグローバル…

Linuxに不慣れな私が頑張ってシェルスクリプトで並列実行しようとした時の備忘録。

下記のコマンドは動作確認してはいないので、万が一この記事を参考にしようとしているのなら十分に注意されたい。 目的 ディレクトリ"text"内に、"test1.txt"、"test2.txt"、...、"testN.txt"というファイルがある。Nは連番になっているわけではなく、飛び飛…

[C++]std::make_tuple、std::tie、std::forward_as_tupleの違い。

C++

いずれも引数を纏めてstd::tupleを作成するという意味では共通している。ただしこれら3つの振る舞いはいずれも異なっていて、状況に応じて適切に使い分ける必要がある。簡潔に言えば、std::make_tupleは引数のコピーを作り、std::tieは引数の左辺値参照を作…

[C++]natvisファイルで多次元の動的配列を表示する。

Visual Studioでデバッグしている時、例えばSTLなどの中身を綺麗に整頓された状態で監視することが出来る。これを自作クラスに対しても行うことは出来るのだろうか?私は標準ライブラリでは設計上の問題が生じる場合によく自作の機能を設計して使うのだが、…

[C++]std::anyとは異なる、動的メモリ確保を行わない動的型を作る。

C++

更新情報 2021年3月18日 色々と設計に問題があったので全面的に作り直した。 動機 std::anyはどのような型のインスタンスでも格納でき、かつデストラクタを呼ぶ必要のない便利な機能だ。ただしインスタンスを格納するメモリは動的に確保される場合があり、し…