2019-01-01から1年間の記事一覧
GitHubで公開しているC++用GnuplotライブラリADAPT-GPM2に等高線表示機能を追加した。Gnuplotが持つ仕様上の問題を吸収するために、ちょっと回りくどい実装になってしまった。 ライブラリについては過去記事を参照。 github.com Gnuplotのpm3dにおける最大の…
以前、range-based for loopに非配列変数の一覧を与えるためのHoldRefArray関数を実装していた時、std::common_typeを使うことはできないかと考えたことがある。のだが、これがどうも“共通して変換可能な型”という説明から連想される結果と今ひとつ合致しな…
Visual C++でプロジェクトをビルドしている時、稀に C2471: プログラム データベース 'file' を更新できません。 C1033: プログラム データベース 'file' を開けません。 というようなエラーが出る場合がある。 多くの場合、これはソースコードの誤りなどで…
Range-based for loopを理解してからというもの、その悪用を色々と思いついてしまって。 今日も小ネタである。実用性はあんまりない。多重ループにすれば良いところを、敢えてそれを統合し一つのループで表現したくなってしまった病的C++erのお遊びだ。唯一…
プログラミング界隈でよく知られたマルチスレッド処理のためのパターンであるスレッドプール。使用可能なスレッド数を予め定めておき、そこにキュー方式で処理を追加していくもの。走らせたい関数が100個くらいあったとしても、それを順番待ちに追加して逐次…
テンプレートメタプログラミングなどをしていると多用することになる、テンプレートの再帰。実はこの再帰回数には制限がある。C++11ではこの再帰回数は1024回が推奨されており十分に大きい。実際の回数制限はコンパイラによって異なるが、それなりに大きな数…
msvcでテンプレートを大量に使うなど非常に重たいコードをコンパイルしていると、 fatal error C1060: ヒープの領域を使い果たしました。 というエラーが出ることがある。 Visual Studioのデフォルトのコンパイラは未だに32bitである。出力するバイナリが32b…
タイトルのとおりである。std::bindはnon-copyableな引数を束縛できないので、rvalue referenceを引数に取るような関数の扱いには注意を要する。 std::bindは、何らかの関数に事前に引数を与えた関数オブジェクトを生成する機能である。事前に引数を与えてお…
解説①に引き続き、本稿ではまだるっこしいことはどうでもいいからグラフを描いてみよう、という趣旨の解説を行う。ちなみに③の予定はない。私がDISLINに愛想を尽かし、使うことを諦めてしまったからだ。 というわけで、ありがちなsin、cos関数をプロットして…
最近、C++でのグラフ描画のためにDISLIN(マックス・プランク研究所開発)を試していた私だが、C++からグラフを描くには多くの場合Gnuplotが選択されるようで、そうでない場合もROOT(CERN開発の統計解析ライブラリ)やせいぜいPLplot(多言語対応のグラフ描…
std::functionは関数ポインタも関数オブジェクトもメンバ関数ポインタもまとめて管理することのできるとても便利な機能である。std::functionは"引数"と"戻り値"の型のみ指定されていればよく、それ以上は何も要求しないので、引数と戻り値の等しい関数オブ…
例えば次のようなクラステンプレートX、Yがあったとする。 template <class> struct X {}; template <class, class> struct Y {}; Xはテンプレート引数が1個、Yはテンプレート引数が2個である。 このX、Yを次のようなクラステンプレートに与えてみる。このXorYは、与えられたXやY</class,></class>…
自作ライブラリのPythonラッパーを作るためにpybind11を導入している私だが、関数引数の型についていくつかのエラーに悩まされたので、備忘録として記しておく。 デフォルト引数の型が適切かどうかはコンパイル時に判定されない。 void func(const std::vect…
先日は複数のコンテナをrange-based for loopで同時に走査する方法を書いたが、今回は配列になっていない同じ型の変数についてループする話。例えばint型の変数i1~i5がある時、i1~i5までをループしたくなったらどうするのか。 よくある方法としては、波括…
C++17未満で使える自作Variantを実装する最中、visit関数の動作を調べている中で偶然見つけ、衝撃を受けた。C++のラムダ式は擬似的にオーバーロードすることができる。 #include <iostream> #include <string> template <class ...Ts> struct OverloadedLambda; template <class T, class ...Ts> struct Overloaded</class></class></string></iostream>…
基底クラスと派生クラスとの間で、同じ関数名、同じ引数、同じ戻り値のメンバ関数をそれぞれ定義し、SFINAEによってそれらを呼び分けることが出来ないかと考えたことがある。 例えば次のようなコードがあったとする。 struct Base { template <class T, std::enable_if_t<std::is_integral<T>::value, std::</class>…
※本記事の内容をC++20の<ranges>に対応するように更新した記事があります。C++20を使用中の方はそちらを参照してください。->std::ranges::views::zip、enumerateの代替機能を作ってみる。 私はrange-based for loopを十分に扱えていなかったのだと思い知った今日こ</ranges>…
モダンC++では、できるだけコンパイル時に処理をして実行時のコストを軽減する設計が望ましいとされる。それは高速化やポリモーフィズムという観点では確かに正しいのだが、往々にして面倒な状況を生む。例えばstd::tuple<...> tに格納した各値について、実…
タイトルのとおりである。ADAPT-GPM2という名前のライブラリだ。 github.com C++によるグラフ描画のためのライブラリは意外と見つかる。CERN開発の統計解析ライブラリであるROOT、マックス・プランク研究所開発のDISLIN、その他PGPLOTやPLplot、比較的小規模…
研究関係のブログを始めることにした。 私は某大学で日々研究に勤しんでいるかもしれない貧乏人である。かれこれ十年近く、日常的な話題を取り扱う個人的なブログを続けてきたのだが、あちらは曲がりなりにも匿名で行っている以上研究内容に言及するような話…